如何对非常量字符串进行子串?

llycmphe  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(361)

我有以下疑问:

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.”字符串时,我尝试将substring的值与我的变量numeroordine关联起来。
有时我没有“nr.”字符串,所以这个查询不起作用,我从substring函数得到错误的值。
如果文本中没有“nr.”字符串,如何创建相同的子字符串?我总是需要找出九个数字。

jucafojl

jucafojl1#

一种方法是使用 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

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

eqzww0vc

eqzww0vc2#

我注意到我的代码有时有前缀“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

相关问题