2011-08-10 56 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你所有的时间。