T-SQL PATINDEX -1

T-SQL PATINDEX -1

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

sql 语句:

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

clienti.SedeLegaleIndirizzoclientitable,SedeLegaleIndirizzo是地址包括streen和number的列。 我想将街道与数字分开,但根据我的陈述,我得到了第一个数字的街道。正如我从 charindex 知道的那样,我可以将 -1 添加到最后一个参数,但问题是 returns 如果我将该参数与 patindex:

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

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

有什么建议吗?

我不太清楚你把 -1 放在哪里,但看起来你是这样做的:

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

这会在找不到数字时出现问题,因为 patindex() 会给出 00-1=-1。您不能有长度为 -1left()。我在这些情况下的解决方案是:

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

这确保如果找不到数字,而不是尝试执行 left(SedeLegaleIndirizzo, -1) 代码将导致 left(SedeLegaleIndirizzo, 0) 并简单地给出一个空字符串。

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

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

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