2017-02-10 25 views
1

我一直在嘗試使用有時填充實數的字符串列對錶進行排序,並且我正在使用對於我來說像一個健全的SQL查詢,但它失敗了,我不知道爲什麼。當這個排序的列結果包含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 S的在結果集中不是數字,但我想我錯了?

有沒有另一種方法我需要這樣做?

基本上,我想搜索結果集ClientID s,如果它們都是數字,按數字順序排序(8,9,10,11,12等),但如果結果中有任何ClientID set包含非數字字符,只需按字符串排序(有時會導致如下所示的內容:1,10,11,2,20等)。

附加信息

  • ClientID實際的數據類型類型爲nchar(10)
  • 解析的數字需要能夠小數,(這就是爲什麼我使用浮動)。
+0

ISNUMERIC()可以使你的問題......'選擇 '真' WHERE ISNUMERIC( '$' )= 1',你可以用'1e4'和其他值替換$。所以你得到的值等於真,但不能轉換爲浮點數。 'TRY_CONVERT'在2012年有效,但如果沒有,您可以使用PATINDEX方法。只需標記版本即可。 – scsimon

+0

我試過這種'SELECT * FROM MasterClientChemicals WHERE ClientID ='1092'ORDER BY CASE WHEN'true'IN(SELECT'true'FROM MasterClientChemicals WHERE ISNUMERIC([Client MSDS])= 0 AND ClientID ='1092')THEN [Client MSDS] ELSE CAST([客戶端MSDS] AS浮動)END ASC,MSDS ASC',但仍然失敗,出現同樣的錯誤。 – VoidKing

+0

我只是告訴你爲什麼你不能使用isnumeric你的情況 – scsimon

回答

2

嗯。這是你想要的嗎?

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; 
+0

請注意,即使CONVERT失敗,ISNUMERIC也可以返回1/true。我不清楚他們爲什麼以這種方式設計它,但它可能會導致頭痛。 – pmbAustin

+0

我覺得第二個代碼仍然會失敗,不是嗎? – scsimon

+0

你的第一個代碼似乎對我很好,非常感謝你! – VoidKing

相關問題