有类似的问题,但我无法找到这个具体案例的答案。
我正在尝试对列执行替换,以便任何类型的括号内的任何内容都将替换为硬编码字符串。
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之外,我正在画一个空白。有更好的想法吗?
答案 0 :(得分:3)
另一种解决方法是使用isnull
和nullif
的组合,而不是为方括号添加额外的案例。
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
:)