簡體   English   中英

特殊字符在sql中排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM