T-SQL PATINDEX -1

时间:2015-01-26 08:10:55

标签: sql sql-server tsql patindex charindex

这是我在这里的第一篇文章,我也是开发中的新手。 无论如何..我的问题是:

sql语句:

SELECT left(clienti.SedeLegaleIndirizzo, patindex('%[0-9]%',clienti.SedeLegaleIndirizzo))
AS indirizzo from Clienti

clienti.SedeLegaleIndirizzoclienti表,SedeLegaleIndirizzo是包含streen和number的地址的列。 我想将街道与数字分开但是我的声明我得到了第一个数字的街道。正如我从charindex知道的,我可以在最后一个参数中添加-1,但问题是如果我将该参数与patindex一起使用,它会返回此错误:

Msg 537, Level 16, State 2, Line 1
Invalid length parameter passed to the LEFT or SUBSTRING function.

我正在使用patindex而不是charindex,因为我正在搜索一个数字......

有什么人的建议?

2 个答案:

答案 0 :(得分:0)

我并不完全清楚你放置-1的位置,但看起来你正在这样做:

SELECT left(clienti.SedeLegaleIndirizzo,
        patindex('%[0-9]%', clienti.SedeLegaleIndirizzo)-1)

如果找不到该号码,则会出现问题,因为patindex()00-1=-1。您的left()长度不能为-1。我在这些情况下的解决方案是:

SELECT left(SedeLegaleIndirizzo,
        isnull(nullif(patindex('%[0-9]%', SedeLegaleIndirizzo)-1, -1), 0))

这确保了如果找不到该号码,则代替left(SedeLegaleIndirizzo, -1)代码将导致left(SedeLegaleIndirizzo, 0)并且只是给出一个空字符串。

答案 1 :(得分:0)

您收到错误的原因很可能是由于没有数字的行会导致patindex(...) -1的结果为负。

一种解决方案是排除这些行:

SELECT LEFT(clienti.SedeLegaleIndirizzo, PATINDEX('%[0-9]%',clienti.SedeLegaleIndirizzo) - 1) 
AS indirizzo FROM Clienti
WHERE PATINDEX('%[0-9]%',clienti.SedeLegaleIndirizzo) > 0