字符范围包括在PATINDEX中关闭方括号

时间:2014-02-17 16:40:52

标签: sql tsql sql-server-2008-r2

有类似的问题,但我无法找到这个具体案例的答案。

我正在尝试对列执行替换,以便任何类型的括号内的任何内容都将替换为硬编码字符串。

e.g。字符串012345[678]将更改为012345[XXXXX] 这应该适用于任何类型的括号,因此012345{678}也会变为012345{XXXXX}

我一直在尝试使用PATINDEX:

SELECT CASE WHEN PATINDEX('%[([<{]%', column1) = 0
           THEN column1
       ELSE LEFT(column1, PATINDEX('%[([<{]%', column1))
             + 'XXXXX'
             + SUBSTRING(column1, PATINDEX('%[)>}[]]]%', column1), 1)
       END
FROM mytable

最后的PATINDEX给了我这个问题,因为结束方括号结束了由[]语法表示的组。我试图通过将其封闭在嵌套括号中来逃避它但它似乎不起作用。除了为方括号添加额外的案例和使用CHARINDEX之外,我正在画一个空白。有更好的想法吗?

2 个答案:

答案 0 :(得分:3)

另一种解决方法是使用isnullnullif的组合,而不是为方括号添加额外的案例。

SELECT CASE WHEN PATINDEX('%[([<{]%', column1) = 0
           THEN column1
       ELSE LEFT(column1, PATINDEX('%[([<{]%', column1))
             + 'XXXXX'
             + SUBSTRING(column1, ISNULL(NULLIF(PATINDEX('%[)>}]%', column1), 0), CHARINDEX(']', column1)), 1)
       END
FROM myTable

答案 1 :(得分:1)

尝试:

SELECT CASE WHEN PATINDEX('%[([<{]%', column1) = 0
           THEN column1
       ELSE LEFT(column1, PATINDEX('%[([<{]%', column1))
             + 'XXXXX'
             + CASE WHEN LEN(SUBSTRING(column1, PATINDEX('%[)>}]%',column1), 1)) > 0
             THEN SUBSTRING(column1, PATINDEX('%[)>}]%',column1), 1)
             ELSE SUBSTRING(column1, CHARINDEX(']',column1), 1) END
       END
FROM mytable

:)

相关问题