SQL Server:如果可能,以数字方式对列进行排序,否则为alpha

时间:2009-08-07 17:08:35

标签: sql-server sql-server-2005 sorting

我正在使用来自外部源的表,并且无法“清理”。有一个列nvarchar(20)并且在95%的时间内包含整数,但偶尔包含alpha。我想使用像

这样的东西
select * from sch.tbl order by cast(shouldBeANumber as integer)

但是这会在奇数“3A”或“D”或“SUPERCEDED”值上引发错误。

有没有办法说“如果可以的话,将其排序为数字,否则只按字符串排序”?我知道那句话中有些邋,,但这基本上就是我想要的。

让我们说例如值是

7,1,5A,SUPERCEDED,2,5,SECTION

如果按以下任何一种方式排序,我会很高兴(因为我真的只需要使用数字方式)

1,2,5,7,5A,SECTION,SUPERCEDED
1,2,5,5A,7,SECTION,SUPERCEDED
SECTION,SUPERCEDED,1,2,5,5A,7
5A,SECTION,SUPERCEDED,1,2,5,7

4 个答案:

答案 0 :(得分:6)

  

我真的只需要与之合作   数字

这只会给你数字的,正确排序:

SELECT
    *
    FROM YourTable
    WHERE ISNUMERIC(YourColumn)=1
    ORDER BY YourColumn

答案 1 :(得分:1)

select 
  * 
from 
  sch.tbl 
order by 
  case isnumeric(shouldBeANumber) 
  when 1 then cast(shouldBeANumber as integer)
  else 0
  end

答案 2 :(得分:0)

SELECT
  (CASE ISNUMERIC(shouldBeANumber)
    WHEN 1 THEN
      RIGHT(CONCAT('00000000',shouldBeANumber), 8)
    ELSE
      shouoldBeANumber) AS stringSortSafeAlpha
ORDEER BY
  stringSortSafeAlpha

这将为所有真正为数字的shouldBeanumber值添加前导零,并保留所有剩余值。这样,当您排序时,您可以使用alpha排序但仍然获得正确的值(使用alpha排序,“100”将小于“50”,但如果您将“50”更改为“050”,则可以使用精细)。请注意,对于此示例,我添加了8个前导零,但您只需要足够的前导零来覆盖列中可能的最大整数。

答案 3 :(得分:0)

如果您的号码长度不超过100个字符:

WITH    chars AS
        (
        SELECT  1 AS c
        UNION ALL
        SELECT  c + 1
        FROM    chars
        WHERE   c <= 99
        ),
        rows AS
        (
        SELECT  '1,2,5,7,5A,SECTION,SUPERCEDED' AS mynum
        UNION ALL
        SELECT  '1,2,5,5A,7,SECTION,SUPERCEDED'
        UNION ALL
        SELECT  'SECTION,SUPERCEDED,1,2,5,5A,7'
        UNION ALL
        SELECT  '5A,SECTION,SUPERCEDED,1,2,5,7'
        )
SELECT  rows.*
FROM    rows
ORDER BY
        (
        SELECT  SUBSTRING(mynum, c, 1) AS [text()]
        FROM    chars
        WHERE   SUBSTRING(mynum, c, 1) BETWEEN '0' AND '9'
        FOR XML PATH('')
        ) DESC