我有一个看起来像这样的数据库:(差不多; 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
值
答案 0 :(得分:3)
实际上这是ISNUMERIC()
类似:'$0.00', '£0.00', '1e10'
将全部报告为数字,但您无法将其转换为INT
或DECIMAL
而是试试这个:
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))