[英]Special Characters sort in sql
我將名為“Contacts”的表命名為id和name。 各列值如下所示。
ID | Name
1 | ABC
3 | DEF
2 | GHI
~! | JKL
null | MNO
null | PQR
我需要查詢要在頂行列出的特殊字符,如下所示。
ID | Name
~! | JKL
1 | ABC
2 | GHI
3 | DEF
null | MNO
null | PQR
我有查詢以使下面列出的空值
select ID, Name
from Contacts
order by ID NULLS LAST
請幫助我獲取特殊字符以獲得第一行排序。
你可以這樣試試
SELECT DISTINCT name
FROM table
ORDER BY name REGEXP '^[a-z]' ASC, name
您可以編寫case
陳述,是所有SQL品牌的標准。 但不是索引友好:
Select ID, Name
from Contacts
order by
( case
when id like '[a-Z][a-Z]%' then 1
when id is null then null
else 0
end
),
ID NULLS LAST
注意 '[aZ][aZ]%'
僅對sql-server有效。 您需要更復雜的句子才能符合所有品牌,例如when id >= 'a' and id <= 'z' then 1
SELECT * FROM
TABLE
ORDER BY
CASE WHEN id NOT LIKE '%[^a-zA-Z0-9]%' THEN 1
WHEN id IS NULL THEN 3
ELSE 2 END, id
使用正則表達式
Declare @tab table(ID Varchar(10) , Name varchar(50))
INSERT INTO @tab
SELECT '1' ,'ABC' Union ALL
SELECT '3' ,'DEF' Union all
SELECT '2' ,'GHI' Union all
SELECT '~!' ,'JKL' Union all
SELECT null,'MNO' Union all
SELECT null,'PQR'
;WITH cte
AS
(
SELECT ID , Name,ROW_NUMBER()Over(Order by Id)Seq FROM
(
SELECT * FROM
(
SELECT *, CASE WHEN CHARINDEX('^~![a-z]',Id) >0 Then 0
WHEN ISNULL(ID,0) =0 THEN 1
ELSE Id END Seq FROM @tab
)Dt
WHERE Dt.ID IS NOT NULL
)Final
UNION ALL
SELECT ID,Name,ROW_NUMBER()Over(Order by Id)Seq1 FROM
(
SELECT * FROM
(
SELECT *, CASE WHEN CHARINDEX('^~![a-z]',Id) >0 Then 0
WHEN ISNULL(ID,0) =0 THEN 1
ELSE Id END Seq FROM @tab
)Dt
WHERE Dt.ID IS NULL
)Final
)
SELECT * FROM CTE
產量
ID Name Seq
-------------------
~! JKL 1
1 ABC 2
2 GHI 3
3 DEF 4
NULL MNO 1
NULL PQR 2
您可以使用以下查詢根據您的要求對NULL ID
進行排序,其中具有NULL ID
行將在最后一行中排序。
Select ID, Name from contact order by
case
when ID IS NULL then 1
else 0
end,ID
對於字符串列的排序:SQL使用字母順序。
NULL是最低值,然后是特殊字符,然后是數字,然后是字母。
如果你在db2中,你只需要按id排序,null將是最后一個
select ID, Name
from Contacts
order by ID
否則你可以用Nothing替換所有數字,然后''用null替換它並按順序排序
select
ifnull(translate(id, ' ', '0123456789'), '') nodigit,
tmp.*
from Contatcs tmp
order by 1 desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.