首页 > 解决方案 > 如何对非常量字符串进行子串化?

问题描述

我有以下查询:

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”时,如何创建相同的子字符串。字符串转换成文本?我总是需要隔离九个数字。

标签: sqlsql-servertsqlsubstring

解决方案


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

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


推荐阅读