2011-08-10 90 views
2

我有名字XYZ一個varchar列,該列中的值是一樣在VARCHAR列比較十進制值

XYZ 
10.2 
9.0 
97.32 

當我寫一個case語句類似

CASE 
    WHEN XYZ > '9.0' THEN 
    'DONE' 
    WHEN XYZ < '7.0' THEN 
    'NOT DONE' 
    WHEN XYZ BETWEEN '7.0' AND '9.0' THEN 
    'NULL' 
    END 

這是不與價值進行比較。應該做些什麼來解決這個問題?

+2

「應該做些什麼來解決這個問題」?使用數字數據類型存儲數字值。任何使用'varchar'的理由?這可以改變嗎?如果沒有,列中有任何非數字值? –

+0

coloumn數據類型是varchar。coloumn沒有任何非數值。 – palum

+1

我知道它是'varchar'你說的問題。你還要問,應該做些什麼來修復它。回答。使用更合適的數據類型。 –

回答

0

您需要在演員進行演出前確定數據是否爲數字。迪納利有一個TRY_CONVERT功能,但在以前的版本中,你需要使用一個CASE WHEN ISNUMERIC(XYZ + 'e0') = 1聲明,既可以被納入主CASE或者如下

DECLARE @YourTable TABLE 
(
XYZ VARCHAR(50) 
) 

INSERT INTO @YourTable 
SELECT 'foo' AS XYZ 
UNION ALL 
SELECT '8.9' 
UNION ALL 
SELECT '9.1' 
UNION ALL 
SELECT '6.5' 

SELECT 
CASE 
    WHEN _XYZ > 9 THEN 
    'DONE' 
    WHEN _XYZ < 7 THEN 
    'NOT DONE' 
    END 
FROM @YourTable 
CROSS APPLY(SELECT CASE WHEN ISNUMERIC(XYZ + 'e0') = 1 
      THEN CAST(XYZ AS NUMERIC(18,8)) END) CA(_XYZ) 
2

如果您知道數據是乾淨的,您可以在該字段上運行強制轉換(或轉換)語句。
CASE WHEN CAST(XYZ AS decimal) > 9.0 THEN 'DONE' WHEN CAST(XYZ AS decimal) < 7.0 THEN 'NOT DONE' WHEN CAST(XYZ AS decimal) BETWEEN 7.0 AND 9.0 THEN 'NULL' END

請注意,您應該失去圍繞「9.0」 另外值得注意的行情中,轉換操作將是對整個領域的運行。這將使索引的使用變得毫無用處,因爲它必須掃描整個表以進行轉換,然後才能進行比較。即使是中等大小的表格(即10-100k條記錄),這也會產生嚴重的性能影響。

+0

是的,這是第一件讓我想起來的事情。在試圖做到這一點時,我的包裝需要很長時間才能運行。所以我想這在我的情況下也不會鍛鍊。 – palum

2

如果該列確實只表示數字,並且從不期望包含數字以外的其他內容,則只需執行一次性將列轉換爲更適當的類型的操作。根據數據的性質,您可能需要在精確和近似類型之間進行選擇,即decimalfloat/real。對於前者,您還必須選擇正確的精度和小數位數(小數點後的位數)。

轉換本身看起來基本上是這樣的:

ALTER TABLE atable 
ALTER COLUMN XYZ decimal(15, 2) 

同樣,你將需要確保有列沒有非數值,否則該語句是要失敗的。

+0

我沒有權限運行alter語句。我還可以找到其他一些數據。所以cast語句也無法將其與其他數據類型(如decimal,float,real)進行轉換 – palum

0
WHEN ISNUMERIC(XYZ) = 0 
           THEN 'DONE' 
       WHEN CONVERT(DECIMAL,XYZ) > 9 
           THEN 'NOT DONE' 
       WHEN CONVERT(DECIMAL,XYZ) < 7.0 
           THEN 'SOMETIMES DONE' 
       WHEN CONVERT(DECIMAL,XYZ) BETWEEN 7.0 AND 9.0 
           THEN 'EVERYTIME DONE' 
       WHEN ISNULL(XYZ,'') = '' 
           THEN 'NONE' 
END 

雅虎atlast完成分離出來!這爲我解決了。 感謝您的幫助和有用的建議 Appretiate你所有的時間。