【问题标题】:How to substring non constant strings?如何对非常量字符串进行子串化?
【发布时间】:2020-07-02 09:02:55
【问题描述】:

我有以下疑问:

UPDATE AmmUser.ORDINI_SCANSIONATI
SET NUMERO_ORDINE=replace((substring([Text],PATINDEX('%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',[Text]),13)),'NR. ',''),
    STATO=1
from AmmUser.ORDINI_SCANSIONATIIndexes
inner join   AmmUser.ORDINI_SCANSIONATIDocs
on ORDINI_SCANSIONATIIndexes.DocumentID=ORDINI_SCANSIONATIDocs.DocumentID
inner join AmmUser.ORDINI_SCANSIONATI
on ORDINI_SCANSIONATIDocs.RecordID =ORDINI_SCANSIONATI.DsRecordID
where PageNumber IS NULL AND STATO IS NULL

通过此查询,当我找到“NR”时,我尝试将子字符串的值与我的变量 NUMERO_ORDINE 相关联。文本列中的字符串。

有时我没有“NR”。字符串,所以这个查询不起作用,我从子字符串函数中得到错误的值。

当我没有“NR”时,如何创建相同的子字符串。字符串转换成文本?我总是需要隔离九个数字。

【问题讨论】:

    标签: sql sql-server tsql substring


    【解决方案1】:

    一种方法是使用CASE 表达式:

    (case when [Text] like '%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
          then replace(substring([Text],
                                 PATINDEX('%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', [Text]),
                                 13
                                ), 'NR. ', ''
                      )
     end),
    STATO = 1
    

    您也可以在搜索时将模式添加到字符串的末尾:

    replace(substring([Text],
                      PATINDEX('%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',
                               [Text] + 'NR. 000000000'),
                      13
                     ), 'NR. ', ''
            ),
    STATO = 1
    

    在这种情况下这有点棘手,因为模式有点复杂。

    【讨论】:

    • 嗨,戈登,谢谢您的回答。我使用您的第一个想法(CASE 语句)和“自定义”来解决问题。
    【解决方案2】:

    我注意到我的代码有时带有前缀“NR”。有时后缀为“DEL”(在很多情况下我同时拥有两者)。所以我使用了 Gordon 提供的第一个解决方案,并进行了一些定制:

    UPDATE AmmUser.ORDINI_SCANSIONATI
    SET NUMERO_ORDINE = CASE
        WHEN [Text] like '%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
        THEN REPLACE(SUBSTRING([Text],PATINDEX('%NR. [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',[Text]),13),'NR.','')
        WHEN [Text] like '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] DEL%'
        THEN REPLACE(SUBSTRING([Text],PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] DEL%',[Text]),9),'DEL','')
        ELSE 'ERRATA LETTURA'
        END,
        STATO=1
    FROM AmmUser.ORDINI_SCANSIONATIIndexes 
        INNER JOIN   AmmUser.ORDINI_SCANSIONATIDocs ON ORDINI_SCANSIONATIIndexes.DocumentID=ORDINI_SCANSIONATIDocs.DocumentID
        INNER JOIN AmmUser.ORDINI_SCANSIONATI ON ORDINI_SCANSIONATIDocs.RecordID =ORDINI_SCANSIONATI.DsRecordID 
        WHERE PageNumber IS NULL AND STATO IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多