使用isnumeric进行T-SQL连接

时间:2014-09-04 16:28:36

标签: sql-server tsql

我有一个看起来像这样的数据库:(差不多; P)

TABLE1

COL1 int (pk)
COL2 bit
COL3 int (FK to TABLE2 COL4)

TABLE2

COL4 int (pk)
COL5 varchar(50)

根据位值,表2中包含的数据是否为数字(1为数字)。

如果我运行此查询:

SELECT 
    CAST(COL5 AS INT) 
FROM 
    TABLE1 
INNER JOIN 
    TABLE2 ON COL4 = COL3 AND COL2 = 1 AND ISNUMERIC(COL5)

我收到转换失败错误:

  

将varchar值'£0.00'转换为数据类型int

时转换失败

没有强制转换的查询不会返回此值,尽管表中包含“£0.00”。

我的印象是ON状态会在演员之前完成,或者我错了(显然)?

编辑:

运行:

SELECT CASE WHEN COL5 LIKE '%[^0-9]%' THEN -1 
            WHEN CAST(COL5 as bigint) > 2147483647 THEN -1 
            ELSE cast(COL5 as int) END
FROM TABLE1
INNER JOIN TABLE2 
    ON COL4 = COL3 AND COL2 = 1

执行并返回no -1

2 个答案:

答案 0 :(得分:3)

实际上这是ISNUMERIC()

的问题

类似:'$0.00', '£0.00', '1e10' 将全部报告为数字,但您无法将其转换为INTDECIMAL

而是试试这个:

SELECT CAST(CAST(COL5 as money) as int) 
FROM TABLE1 
INNER JOIN TABLE2 ON COL4 = COL3 AND COL2 = 1 AND ISNUMERIC(COL5)

我有一篇关于ISNUMERIC()问题的博客文章: http://www.thatcoderguy.co.uk/2014/04/07/the-problem-with-isnumeric/

答案 1 :(得分:0)

SELECT部分中的表达式与JOIN中的表达式无关,因此将它们放在select上的事实不会以任何方式影响连接表达式。但是,当ON事件在 SELECT列表之前完成时,你是对的。

由于col5调用都不同且不相关,因此必须重复强制转换:

SELECT cast(COL5 as int)
FROM TABLE1
INNER JOIN TABLE2 ON COL4 = COL3 AND
                     COL2 = 1 AND
                     ISNUMERIC(CAST(COL5 AS INT))