替换功能,保留未知的子字符串/通配符

时间:2019-03-06 09:39:29

标签: sql sql-server replace wildcard

我尝试过在线寻找答案,但是我缺少正确的命名法来找到与我的问题相匹配的答案。

我正在使用的数据库混乱。我目前正在尝试导入一些维护代码,这些维护代码必须链接到预先存在的Excel表。因此,我导入的维护代码必须非常通用。 该表设计为使用2-3位数字(时间长度),后跟一个时间单位。

例如SERV-01WSERV-03M

由于这些通常是手动添加到DB的,因此实际上许多旧的维护代码都是用1位数字写的。

例如SERV-1WSERV-3M

我想用新代码替换旧代码。换句话说,如果代码中只使用一位数字,我想添加一个前导0。

REPLACE(T.Code,'-[0-9][DWM]','-0[0-9][DWM]')不幸地无法正常工作,很可能是因为我在结果字符串中使用了通配符。

什么是处理此问题的好方法?

谢谢。

2 个答案:

答案 0 :(得分:2)

假设我了解您的要求,那么您应该得到的是什么:

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,我强迫表达式返回NULL,然后用另外的ISNULL包裹了整个内容,所以返回原始值。

答案 1 :(得分:0)

我发现一个简单的CASE表达式是表达逻辑的一种简单方法:

SELECT (CASE WHEN code LIKE '%-[0-9][0-9]%'
             THEN code
             ELSE REPLACE(code, '-', '-0')
        END)

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

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