1

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在第三个字符后添加 (/)。如果添加后存在任何其他字符,slash则将其删除。所以对于 [AA11✏AAA ZZZZ] 应该更新为 [AA11✏AAA/]。

如果NCHAR(9999)存在且前 4 个字符之前有字符,则删除它们。因此,对于 [CRAP BB22✏BBB] 应更新为 [BB22✏BBB/] 对于 [NONSENSE] 应显示为NULL

预期的

这是我所得到的。如您所见,我坚持添加slash和删除不需要的字符。

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
4

2 回答 2

1

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

select  case when patindex('%' + nchar(9999) + '%' , NodePropertyValue)=0 then null
            else substring( NodePropertyValue, patindex('%' + nchar(9999) + '%', NodePropertyValue)-4, 8) + '/'
        end as StringStart
from @Table
于 2017-10-24T10:32:06.670 回答
1

这是获得所需结果的一种方法:

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

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')

用于计算所需模式的开始和结束的 cte

;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

在 rextester 上查看现场演示。

于 2017-10-24T10:43:24.200 回答