【发布时间】:2018-05-04 09:38:25
【问题描述】:
我在使用 sqlserver 的 ISNUMERIC 函数时遇到问题,它为 ',' 返回 true
我正在解析邮政编码并尝试查看第二个字符(应该是数字)是否为 0,并在每种情况下执行不同的操作。问题是我不能通过首先检查 isNumeric 来转换字符。这是我的标量值函数的代码,用于返回第二个字符位置中的数字,如果不是数字,则返回 -1。
@declare firstDigit int
IF ISNUMERIC(SUBSTRING(@postal,2,1) AS int) = 1
set @firstDigit = CAST(SUBSTRING(@postal,2,1) AS int)
ELSE
set @firstDigit = -1
RETURN @firstdigit
因为当邮政编码不完全有效时,这会失败。我只是想找出如何检查 nvarchar @postal 的第二个字符是否是 0-9 之间的数字。我见过不同类型的解决方案,例如使用LIKE [0-9] 或使用PATINDEX 等。
有没有更好/更简单的方法来做到这一点,如果没有,哪种方法最快?
编辑:根据 Aaron Bertrand 的建议添加代码
ON z.postal =
CASE
WHEN CONVERT(INT, CASE WHEN SUBSTRING(v.patientPostal,2,1) LIKE '[0-9]'
THEN SUBSTRING(v.patientPostal, 2,1) END) = 0 then v.patientPostal
WHEN CONVERT(INT, CASE WHEN SUBSTRING(v.patientPostal,2,1) LIKE '[0-9]'
THEN SUBSTRING(v.patientPostal, 2,1) END) > 0 then LEFT(v.patientPostal,3)
【问题讨论】:
-
您能发布更多代码吗?我认为它在非数字第二位上失败的原因可能与您显示的 IF 子句后面的内容有关。
-
差不多就是这样,我创建了一个标量值函数来返回数字,如果不是,则返回-1。如果有帮助,我可以用整个功能更新它。
-
谢谢,我会调查的,所以你认为我应该在原地完成整个检查并使用 like 吗?我没有意识到标量 UDF 有点受打击,我只使用 sqlserver 很短的时间
-
哪些模式有好有坏?每个国家/地区的邮政编码都不同...
-
我只是在那里寻找一个数字,我正在查看的邮政编码模式仅与加拿大安大略省有关,例如 A1B2C3
标签: sql sql-server tsql sql-server-2008 isnumeric