【问题标题】:How can I use a string from array to search for string如何使用数组中的字符串来搜索字符串
【发布时间】:2021-09-15 17:28:02
【问题描述】:

我的 SQL Server 表中有一个列(参见下面的示例)。我需要编写一个查询来返回包含给定字符串的行,例如830。但是,我需要在字符串数组中搜索任何字符串。

举个例子:

  • 我有一个像 '634,7,830' 这样的字符串数组。
  • 使用“634,7,830”作为输入调用我的查询
  • 结果应为第 3、5、6 和 7 行

这是就我而言,但在这里我只得到最后三行而不是包含“830”的那一行。

我怎样才能得到丢失的?

SELECT * 
FROM dbo.YYY
WHERE [DepartmentNo] IN (SELECT value 
                         FROM STRING_SPLIT('634,7,830', ','))

【问题讨论】:

  • SQL Server 不支持数组数据类型;事实上(在我看来)没有good RDBMS 应该。 RDBMS 中的值应该代表一个原子值;这意味着它代表一个特定的值。您在此处需要做的真正的事情是修复您的设计并规范化您的数据。
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql


【解决方案1】:

你很亲密。也许这会有所帮助

-- Just a Demonstrative Table Variable.

Declare @YourTable Table ([DepartmentNo] varchar(50))  Insert Into @YourTable Values 
 ('403,273,828')
,('403,273,829')
,('403,273,830')
,('403,273,831')
,('634')
,('634')
,('7')

-- The Actual Query
 
Select * 
 from @YourTable A
 cross apply string_split([DepartmentNo],',') B
 Where B.value in (select * from string_split('634,7,830',','))

结果

DepartmentNo    value
403,273,830     830
634             634
634             634
7               7

这是一个剥离控制字符的 SVF

CREATE FUNCTION [dbo].[svf-Str-Strip-Control](@S varchar(max))
Returns varchar(max)
Begin
    Select @S=Replace(@S,char(n),' ')
     From  (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31) ) N(n)

    Return ltrim(rtrim(replace(replace(replace(@S,' ','†‡'),'‡†',''),'†‡',' ')))
End
--Select [dbo].[svf-Str-Strip-Control]('Michael        '+char(13)+char(10)+'LastName')  --Returns: Michael LastName

然后更新答案

Declare @YourTable Table ([DepartmentNo] varchar(50))  Insert Into @YourTable Values 
 ('403,273,828')
,('403,273,829')
,('403,273,830'+char(8))  -- Notice char(8)
,('403,273,831')
,('634')
,('634')
,('7')
 
Select * 
 from @YourTable A
 cross apply string_split([dbo].[svf-Str-Strip-Control]([DepartmentNo]),',') B
 Where B.value in (select * from string_split('634,7,830',','))

结果同上或dbFiddle

【讨论】:

  • 嗨,约翰。这在 SQL Server 中对您有用吗?当我尝试您的查询时,我仍然只得到 634;634;7
  • .. 当两个或多个搜索值与同一个部门匹配时,将“cross apply”替换为“where exists”不会返回重复项。例如搜索('403,273')
  • @Birch78 是的,这适用于 SQL Server dbfiddle.uk/…。也许您有尾随控制字符,例如制表符或 CRLF
  • @lptr OP 不是在寻找不同的值。明确说明所需的行“3、5、6 和 7”
  • 这太奇怪了。我复制粘贴了您的代码并将@YourTable 替换为我的表名
猜你喜欢
  • 2022-01-23
  • 2011-07-22
  • 1970-01-01
  • 2012-07-20
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
相关资源
最近更新 更多