替换函数,保留未知 substrings/wildcards
Replace function, keep unknown substrings/wildcards
我曾尝试在网上寻找答案,但我没有正确的命名法来找到与我的问题相匹配的答案。
我正在使用的数据库一团糟。我目前正在尝试将我必须 link 的一些维护代码导入到预先存在的 Excel table。因此,我导入的维护代码必须非常通用。
table 旨在使用 2-3 位数字(时间长度),后跟时间单位。
例如,SERV-01W
和 SERV-03M
。
由于这些过去都是手工添加到数据库中的,因此大量较旧的维护代码实际上是用一位数字编写的。
例如,SERV-1W
和 SERV-3M
。
我想用新代码替换旧代码。换句话说,如果代码中只使用一位数字,我想添加一个前导 0。
不幸的是,REPLACE(T.Code,'-[0-9][DWM]','-0[0-9][DWM]')
不起作用,很可能是因为我在结果字符串中使用了通配符。
处理这个问题的好方法是什么?
提前致谢。
假设我了解您的要求,这应该可以满足您的需求:
WITH VTE AS(
SELECT *
FROM (VALUES('SERV-03M'),
('SERV-01W'),
('SERV-1Q'),
('SERV-4X')) V(Example))
SELECT Example,
ISNULL(STUFF(Example, NULLIF(PATINDEX('%-[0-9][A-z]%',Example),0)+1,0,'0'),Example) AS NewExample
FROM VTE;
我没有尝试替换模式,而是使用 PATINDEX
找到模式,然后注入额外的 '0'
字符。如果没有找到模式,那么 0
是由 PATINDEX
编辑的 return,我将表达式强制为 return NULL
然后用进一步 ISNULL
,因此原始值是 returned.
我发现一个简单的 CASE
表达式是表达逻辑的简单方法:
SELECT (CASE WHEN code LIKE '%-[0-9][0-9]%'
THEN code
ELSE REPLACE(code, '-', '-0')
END)
也就是说,如果代码有两位数,则什么都不做。否则,添加一个零。代码应该很清楚它在做什么。
这不是一般化的(例如,它不会添加两个零),但它确实可以满足您的要求。
我曾尝试在网上寻找答案,但我没有正确的命名法来找到与我的问题相匹配的答案。
我正在使用的数据库一团糟。我目前正在尝试将我必须 link 的一些维护代码导入到预先存在的 Excel table。因此,我导入的维护代码必须非常通用。 table 旨在使用 2-3 位数字(时间长度),后跟时间单位。
例如,SERV-01W
和 SERV-03M
。
由于这些过去都是手工添加到数据库中的,因此大量较旧的维护代码实际上是用一位数字编写的。
例如,SERV-1W
和 SERV-3M
。
我想用新代码替换旧代码。换句话说,如果代码中只使用一位数字,我想添加一个前导 0。
不幸的是,REPLACE(T.Code,'-[0-9][DWM]','-0[0-9][DWM]')
不起作用,很可能是因为我在结果字符串中使用了通配符。
处理这个问题的好方法是什么?
提前致谢。
假设我了解您的要求,这应该可以满足您的需求:
WITH VTE AS(
SELECT *
FROM (VALUES('SERV-03M'),
('SERV-01W'),
('SERV-1Q'),
('SERV-4X')) V(Example))
SELECT Example,
ISNULL(STUFF(Example, NULLIF(PATINDEX('%-[0-9][A-z]%',Example),0)+1,0,'0'),Example) AS NewExample
FROM VTE;
我没有尝试替换模式,而是使用 PATINDEX
找到模式,然后注入额外的 '0'
字符。如果没有找到模式,那么 0
是由 PATINDEX
编辑的 return,我将表达式强制为 return NULL
然后用进一步 ISNULL
,因此原始值是 returned.
我发现一个简单的 CASE
表达式是表达逻辑的简单方法:
SELECT (CASE WHEN code LIKE '%-[0-9][0-9]%'
THEN code
ELSE REPLACE(code, '-', '-0')
END)
也就是说,如果代码有两位数,则什么都不做。否则,添加一个零。代码应该很清楚它在做什么。
这不是一般化的(例如,它不会添加两个零),但它确实可以满足您的要求。