替换函数,保留未知 substrings/wildcards

Replace function, keep unknown substrings/wildcards

我曾尝试在网上寻找答案,但我没有正确的命名法来找到与我的问题相匹配的答案。

我正在使用的数据库一团糟。我目前正在尝试将我必须 link 的一些维护代码导入到预先存在的 Excel table。因此,我导入的维护代码必须非常通用。 table 旨在使用 2-3 位数字(时间长度),后跟时间单位。

例如,SERV-01WSERV-03M

由于这些过去都是手工添加到数据库中的,因此大量较旧的维护代码实际上是用一位数字编写的。

例如,SERV-1WSERV-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)

也就是说,如果代码有两位数,则什么都不做。否则,添加一个零。代码应该很清楚它在做什么。

这不是一般化的(例如,它不会添加两个零),但它确实可以满足您的要求。