regex 如何删除Microsoft SQL Server 2016上引号之间的字符串?

dsf9zpds  于 2023-05-01  发布在  SQL Server
关注(0)|答案(3)|浏览(261)

对于像这样的字符串列"This is comment 1""comment 2"3302,双引号之间的0个或多个注解与结尾的某个项目的任意长度或字符的id连接。如何在Microsoft SQL Server 2016上仅提取ID,以便最终结果成为3302
输入示例:

Item                                                     Qty
2d3eu                                                    30
"This item is discontinued"103d2h                        20
"Just some random comment"1er3fhvd                       10
"There can be any number of comment""Like this"144       20

所需输出:

Item      Qty
2d3eu     30
103d2h    20
1er3fhvd  10
144       20
7ivaypg9

7ivaypg91#

您可以通过找到字符串中最后一个",然后将所有字符取到RIGHT中来提取Item。注意,我们在字符串的开头添加一个",以确保每个值中至少有一个:

SELECT RIGHT(Item, CHARINDEX('"', REVERSE(CONCAT('"', Item))) - 1) AS Item, Qty
FROM stock

输出:

Item    Qty
00001   30
00002   20
00003   10
00004   20

Demo on dbfiddle

l5tcr1uw

l5tcr1uw2#

如果ID永远只有4个字符长,你可以使用comment = right(comment,4)
但是,如果代码的长度可能会改变,则需要找到最右边的双引号字符,然后取后面的文本。(下面假设字符串最多为100个字符,因此根据需要进行调整。你还需要用单引号括起你的原始字符串,以便sql满意)。

Declare @Original_string as varchar(100)
Select @Original_string = '"This is comment 1""comment 2"3302'
Select NewString = reverse(left(reverse(@Original_string), charindex('"', reverse(@Original_string)) -1))

摘自@Philip Kelley的另一个Stack Exchange回答:Find index of last occurrence of a sub-string using T-SQL

nr7wwzry

nr7wwzry3#

请尝试以下解决方案。
它基于通过XML和XQuery的 * 标记化 *。
r[last()] predicate 完成了所有的魔术。

SQL语句

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(MAX));
INSERT @tbl (tokens) VALUES
('00001'),
('"This item is discontinued"00002'),
('"There can be any number of comment""Like this"00004');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '"';

SELECT t.*
    , result = c.value('(/root/r[last()]/text())[1]', 'VARCHAR(10)')
FROM @tbl AS t
    CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
        REPLACE(tokens, @separator, ']]></r><r><![CDATA[') + 
        ']]></r></root>' AS XML)) AS t1(c);

输出

ID代币结果
10000100001
“此产品已停产“0000200002
“可以有任意数量的评论”“像这样“0000400004

相关问题