如何解决在sql列中搜索字符串,并且需要用前缀分割所需的字符串
我有一个表,有两列account和rt_exclude。我只需要从带有前缀的rt_exclude列中选择单词“ exclusion”。rt_exclude列包含许多不同长度的行,所以我不想使用case语句
123,278-C Share Exclusion; 3405-B Share Exclusion; 5784-Reit Exclusion
333,278-C Share Exclusion; 3405-B Share Exclusion; 5784-Reit Exclusion; 6532-Exclude GIREX 39822J102
444,3274-TSSAX Exclusion; 3370-BFAFX Exclusion; 3405-B Share Exclusion; 5784-Reit Exclusion
必填项应与“帐户”列中的内容相同
123,Share Exclusion
123,Reit Exclusion
333,Share Exclusion
333,Reit Exclusion
444,TSSAX Exclusion
444,BFAFX Exclusion
444,Reit Exclusion
解决方法
这看起来像string_split()
:
select t.col1,s.value
from t cross apply
string_split(col2,'; ') s
where s.value like '%Exclusion';
请注意,不建议在单个列中存储多个值。您应该重新考虑数据模型。
,如果您使用的是SQL Server 2016+,请按照建议使用string_split。
要在SQL Server 2014及以下版本中完成此操作,您需要自定义拆分功能,例如SO上here或here的dbo.SplitStrings_CTE。
CREATE FUNCTION dbo.SplitStrings_CTE
(
@List NVARCHAR(MAX),@Delimiter NVARCHAR(255)
)
RETURNS @Items TABLE (Item NVARCHAR(4000))
WITH SCHEMABINDING
AS
BEGIN
DECLARE @ll INT = LEN(@List) + 1,@ld INT = LEN(@Delimiter);
WITH a AS
(
SELECT
[start] = 1,[end] = COALESCE(NULLIF(CHARINDEX(@Delimiter,@List,1),0),@ll),[value] = SUBSTRING(@List,1,COALESCE(NULLIF(CHARINDEX(@Delimiter,@ll) - 1)
UNION ALL
SELECT
[start] = CONVERT(INT,[end]) + @ld,[end] + @ld),[end] + @ld,@ll)-[end]-@ld)
FROM a
WHERE [end] < @ll
)
INSERT @Items SELECT [value]
FROM a
WHERE LEN([value]) > 0
OPTION (MAXRECURSION 0);
RETURN;
END
GO
选择变为
SELECT t.id,SUBSTRING(s.Item,PATINDEX('%[^0-9- ]%',s.Item)+1,LEN(s.Item)) AS col
FROM docs t
CROSS APPLY SplitStrings_CTE(content,';') s
WHERE s.Item LIKE '%Exclusion';
,
这是您想要的吗?
Select res.col1,SUBSTRING(res.col2,CHARINDEX('-',res.col2)+CHARINDEX(' ',res.col2),99)
from
(
select StringSplit.col1,value col2
from StringSplit
Cross Apply STRING_SPLIT(StringSplit.col2,';') as ss
WHERE StringSplit.col2 LIKE '%Exclu%') as res
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。