【问题标题】:Replace function, keep unknown substrings/wildcards替换函数,保留未知子串/通配符
【发布时间】:2019-07-27 22:13:02
【问题描述】:

我曾尝试在网上寻找答案,但我缺乏正确的命名法来找到与我的问题匹配的任何答案。

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

例如,SERV-01WSERV-03M

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

例如,SERV-1WSERV-3M

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

REPLACE(T.Code,'-[0-9][DWM]','-0[0-9][DWM]') 很遗憾不起作用,很可能是因为我在结果字符串中使用了通配符。

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

提前谢谢你。

【问题讨论】:

    标签: sql sql-server replace wildcard


    【解决方案1】:

    假设我了解您的要求,这应该可以满足您的需求:

    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' 字符。如果没有找到模式,所以0PATINDEX 返回,我强制表达式返回NULL,然后用另一个ISNULL 包装整个东西,这样就返回了原始值。

    【讨论】:

    • 正是我所需要的,而且如此简单,我自己应该想到的。干杯。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的努力,但这会使查询过于复杂。我第一篇文章中的查询是更长查询的一部分。本专栏的最后一行变成了CASE WHEN T.Code LIKE '%SERV%' Then SUBSTRING(ISNULL(STUFF(T.Code, NULLIF(PATINDEX('%-[0-9][DMW]%',T.Code),0)+1,0,'0'),T.Code) WHEN T.Code LIKE '%-OVE%' THEN SUBSTRING(REPLACE(T.Code,'OVE-','OVER-'), CHARINDEX('-OVE', T.Code)+1, 20) ELSE SUBSTRING(T.Code, CHARINDEX('SAFS', T.Code), 20) END TaskType
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2015-09-05
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2015-12-14
    • 2012-11-21
    相关资源
    最近更新 更多