SQL Patindex / Regex - 匹配 2 个撇号之间的字符数不超过 4 个
SQL Patindex / Regex - Match where there are 4 or less characters between 2 apostrophes
我有以下字符串:
'Siemens','Simatic','Microbox','PC','27','6ES7677AA200PA0','6ES7','677AA200PA0'
我想删除任何少于 5 个字符的“术语”。所以在这种情况下,我想删除 'PC'、'27' 和 '6ES7'。
这将导致:
'Siemens','Simatic','Microbox','6ES7677AA200PA0','677AA200PA0'
这是在 SQL 服务器中,我有一个接受正则表达式命令的函数,目前看起来是这样的:
SELECT dbo.fn_StripCharacters(title, '/^''PC''$/')
我试图硬编码删除 'PC' 但我认为它删除了所有撇号,以及 'P' 和 'C' 字符:
Siemens,Simati,Mirobox,,427B,6ES76477AA200A0,6ES7,6477AA200A0
这是我正在使用的函数:
CREATE FUNCTION [dbo].[fn_StripCharacters]
(
@String NVARCHAR(MAX),
@MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @MatchExpression = '%['+@MatchExpression+']%'
WHILE PatIndex(@MatchExpression, @String) > 0
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
RETURN @String
END
如果您不关心在过滤掉 4 个或更少字符的单词后保留的单词的特定顺序,您可以使用 STRING_SPLIT
和 STRING_AGG
:
WITH cte AS (
SELECT id, value
FROM yourTable
CROSS APPLY STRING_SPLIT(val, ',')
)
SELECT id, STRING_AGG(value, ',') AS val
FROM cte
WHERE LEN(value) > 6
GROUP BY id;
我有以下字符串:
'Siemens','Simatic','Microbox','PC','27','6ES7677AA200PA0','6ES7','677AA200PA0'
我想删除任何少于 5 个字符的“术语”。所以在这种情况下,我想删除 'PC'、'27' 和 '6ES7'。
这将导致:
'Siemens','Simatic','Microbox','6ES7677AA200PA0','677AA200PA0'
这是在 SQL 服务器中,我有一个接受正则表达式命令的函数,目前看起来是这样的:
SELECT dbo.fn_StripCharacters(title, '/^''PC''$/')
我试图硬编码删除 'PC' 但我认为它删除了所有撇号,以及 'P' 和 'C' 字符:
Siemens,Simati,Mirobox,,427B,6ES76477AA200A0,6ES7,6477AA200A0
这是我正在使用的函数:
CREATE FUNCTION [dbo].[fn_StripCharacters]
(
@String NVARCHAR(MAX),
@MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @MatchExpression = '%['+@MatchExpression+']%'
WHILE PatIndex(@MatchExpression, @String) > 0
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
RETURN @String
END
如果您不关心在过滤掉 4 个或更少字符的单词后保留的单词的特定顺序,您可以使用 STRING_SPLIT
和 STRING_AGG
:
WITH cte AS (
SELECT id, value
FROM yourTable
CROSS APPLY STRING_SPLIT(val, ',')
)
SELECT id, STRING_AGG(value, ',') AS val
FROM cte
WHERE LEN(value) > 6
GROUP BY id;