代码之家  ›  专栏  ›  技术社区  ›  Mazhar

使用子字符串PATINDEX和STUFF修改数据的TSQL

  •  1
  • Mazhar  · 技术社区  · 7 年前

    TSQL MSSQL 2008r2

    我需要帮助修改数据。 我已经走了这么远,现在我需要帮助。

    样本数据

    [编辑]添加了其他示例

    DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
    INSERT INTO @Table (NodePropertyValue)
    VALUES 
        (N'AA11✏AAA ZZZZ'),
        (N'CRAP BB22✏BBB'),
        (N'CC55✏CC1'),
        (N'DD66✏666'),
        (N'EE55✏EEE     ES177'),
        (N'RUBBISH FF22✏FFF XXXXXX'),
        (N'NONSENSE')
    

    我想这样显示数据。 如果 NCHAR(9999) 或者铅笔存在,接下来的3个字符是字母,然后添加一个 slash 第三个字符后的(/)。如果在添加的 然后删除它们。因此,[AA11AAA zzzzzz]应更新为[AA11AAA/]。

    如果 NCHAR(9999) 存在并且前4个字符之前有个字符,请删除它们。所以对于[CRAP BB22BBB]应该更新为[BB22BBB/] 因为[胡说八道]应该显示为 NULL .

    expected

    这是我所能做到的。正如你所见,我一直在添加一个 斜线 删除不需要的字符。

    SELECT
         V.NodePropertyValue 'Orignal'
        ,CASE   --Pencil NCHAR(9999) exists
            WHEN PATINDEX('%'+NCHAR(9999)+'%', UPPER(V.NodePropertyValue)) > 0
                THEN
                    CASE 
                        WHEN --FIRST 4 chars match XX11 and 5th char equals NCHAR(9999) 
                            PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0 
                            AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
                        THEN 
                            STUFF(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
                                , 50
                                , SUBSTRING(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
                        WHEN --Any 4 chars match XX11 and preceding char is space and 5th char equals NCHAR(9999) 
                            PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0 
                            AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
                        THEN 
                            STUFF(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
                                , 50
                                , SUBSTRING(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
                        ELSE
                            NULL
                    END
            ELSE
                NULL
        END 'Updated'
    FROM
        @Table V
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Zohar Peled    7 年前

    以下是获得所需结果的方法:

    创建并填充样本表(我根据我们在评论中的对话添加了更多样本数据)

    DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
    INSERT INTO @Table (NodePropertyValue)
    VALUES 
    (N'AA11✏AAA ZZZZ'),
    (N'CRAP BB22✏BBB'),
    (N'EE55✏EEE     ES177'),
    (N'RUBBISH FF22✏FFF XXXXXX'),
    (N'AA✏AAA ZZZZ'),
    (N'AA✏A2A ZZZZ'),
    (N'AA✏A'),
    (N'NONSENSE')
    

    计算所需图案的开始和结束的连接时序图

    ;WITH CTE AS
    (
    SELECT NodePropertyValue,
           -- note: there are are 4 underscores before the pencil
           PATINDEX('%____'+ NCHAR(9999) +'[a-z][a-z][a-z]%', NodePropertyValue) As startPattern, 
           CHARINDEX(NCHAR(9999), NodePropertyValue) + 3 As EndPattern
    FROM @Table
    )
    

    查询cte:

    SELECT  NodePropertyValue, 
            CASE WHEN startPattern > 0 THEN
                SUBSTRING(NodePropertyValue, startPattern, EndPattern-startPattern+1) + '/'
            ELSE
                NULL
            END As Updated
    FROM CTE
    

    结果:

    NodePropertyValue           Updated
    AA11✏AAA ZZZZ               AA11✏AAA/
    CRAP BB22✏BBB               BB22✏BBB/
    EE55✏EEE     ES177          EE55✏EEE/
    RUBBISH FF22✏FFF XXXXXX     FF22✏FFF/
    AA✏AAA ZZZZ                 NULL
    AA✏A2A ZZZZ                 NULL
    AA✏A                        NULL
    NONSENSE                     NULL
    

    See a live demo on rextester.

        2
  •  1
  •   cloudsafe    7 年前

    如果铅笔后面总是有字母,没有数字,这就足够了吗?

    select  case when patindex('%' + nchar(9999) + '%' , NodePropertyValue)=0 then null
                else substring( NodePropertyValue, patindex('%' + nchar(9999) + '%', NodePropertyValue)-4, 8) + '/'
            end as StringStart
    from @Table