我需要在SQL Server 2012中检查数字与否的列。
这是我的案例代码。
CASE
WHEN ISNUMERIC(CUST_TELE) = 1
THEN CUST_TELE
ELSE NULL
END AS CUSTOMER_CONTACT_NO
但是当达到'78603D99'
值时,它返回1
,这意味着SQL Server将此字符串视为数字。
为什么?
如何避免这类问题?
答案 0 :(得分:15)
不幸的是,SQL Server中的ISNUMERIC()
函数有许多怪癖。它并非完全错误,但它很少会在人们第一次使用它时达到预期效果。
但是,由于您使用的是SQL Server 2012,因此可以使用TRY_PARSE()
函数来执行您想要的操作。
返回NULL:
SELECT TRY_PARSE('7860D399' AS int)
返回7860399
SELECT TRY_PARSE('7860399' AS int)
https://msdn.microsoft.com/en-us/library/hh213126.aspx
显然,这适用于INT
以外的数据类型。你说你想检查一个值是否为数字,但我认为你的意思是INT
。
答案 1 :(得分:3)
虽然try_convert()
或try_parse()
适用于内置类型,但它可能无法完全符合您的要求。例如,它可能允许小数点,负号,并限制数字的长度。
此外,isnumeric()
将识别负数,小数和指数表示法。
如果您只想测试数字的字符串,那么您可以使用not like
逻辑:
(CASE WHEN CUST_TELE NOT LIKE '%[^0-9]%'
THEN CUST_TELE
END) AS CUSTOMER_CONTACT_NO
这只是说CUST_TELE
不包含任何不是数字的字符。
答案 2 :(得分:0)
除了添加一些警告外,没有什么实质内容。
1)ISNUMERIC()不会出现空格,但会破坏数字转换。
2)如果该字段中只有一个非数字字符,而您使用REPLACE删除它,则仍然需要处理空白(通常使用CASE语句)。
例如,如果该字段包含单个'-'字符,而您使用此字符:
cast(REPLACE(myField, '-', '') as decimal(20,4)) myNumField
它将失败,您将需要使用以下内容:
CASE WHEN myField IN ('','-') THEN NULL ELSE cast(REPLACE(myField, '-', '') as decimal(20,4)) END myNumField