我正在使用来自外部源的表,并且无法“清理”。有一个列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
答案 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