当此排序的列结果包含 SQL 中的所有数字时,如何按数字字符串将 table 排序为数字?
How can I sort a table by a numerical string as a number when this sorted columns results contain all numbers in SQL?
我一直在尝试使用有时用实数填充的字符串列对 table 进行排序,并且我正在使用在我看来像是合理的 sql 查询,但是它失败了,我不确定为什么。
这是我的查询:
SELECT * FROM chemicals
WHERE ClientID = '9999'
ORDER BY CASE WHEN 0 IN
(SELECT ISNUMERIC([Client Number])
FROM chemicals
WHERE ClientID = '9999')
THEN [Client Number]
ELSE CAST([Client Number] AS float) END ASC, MSDS ASC
而且我不断收到此错误:
Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float.
如果它发现结果集中的任何 ClientID
都不是数字,它似乎不应该尝试转换它,但我想我错了?
我需要用另一种方法来做这件事吗?
基本上,我想搜索 ClientID
的结果集,如果它们都是数字,则按数字顺序排序(8、9、10、11、12 等),但如果结果集中的任何 ClientID
包含非数字字符,只需按字符串排序(有时会导致类似以下内容:1、10、11、2、20 等)。
附加信息
ClientID
的实际数据类型是nchar(10)
- 可解析的数字需要能够包含小数(这就是我使用浮点数的原因)。
嗯。这是你想要的吗?
SELECT c.*
FROM chemicals c
WHERE ClientID = '9999'
ORDER BY TRY_CONVERT(float, [Client Number]),
[Client Number],
MSDS ASC;
在 2012 之前的版本中,您可以使用 case
语句代替 try_convert()
:
SELECT c.*
FROM chemicals c
WHERE ClientID = '9999'
ORDER BY (CASE WHEN ISNUMERIC([Client Number]) = 1 THEN CONVERT(float, [Client Number]) END),
[Client Number],
MSDS ASC;
我一直在尝试使用有时用实数填充的字符串列对 table 进行排序,并且我正在使用在我看来像是合理的 sql 查询,但是它失败了,我不确定为什么。
这是我的查询:
SELECT * FROM chemicals
WHERE ClientID = '9999'
ORDER BY CASE WHEN 0 IN
(SELECT ISNUMERIC([Client Number])
FROM chemicals
WHERE ClientID = '9999')
THEN [Client Number]
ELSE CAST([Client Number] AS float) END ASC, MSDS ASC
而且我不断收到此错误:
Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float.
如果它发现结果集中的任何 ClientID
都不是数字,它似乎不应该尝试转换它,但我想我错了?
我需要用另一种方法来做这件事吗?
基本上,我想搜索 ClientID
的结果集,如果它们都是数字,则按数字顺序排序(8、9、10、11、12 等),但如果结果集中的任何 ClientID
包含非数字字符,只需按字符串排序(有时会导致类似以下内容:1、10、11、2、20 等)。
附加信息
ClientID
的实际数据类型是nchar(10)- 可解析的数字需要能够包含小数(这就是我使用浮点数的原因)。
嗯。这是你想要的吗?
SELECT c.*
FROM chemicals c
WHERE ClientID = '9999'
ORDER BY TRY_CONVERT(float, [Client Number]),
[Client Number],
MSDS ASC;
在 2012 之前的版本中,您可以使用 case
语句代替 try_convert()
:
SELECT c.*
FROM chemicals c
WHERE ClientID = '9999'
ORDER BY (CASE WHEN ISNUMERIC([Client Number]) = 1 THEN CONVERT(float, [Client Number]) END),
[Client Number],
MSDS ASC;