如何从SQL列中的逗号分隔字符串中搜索逗号分隔的字符串?

时间:2020-03-20 09:46:25

标签: sql

我的数据库中有一个逗号分隔的字符串(类别)列,如下所示:

|-------------------|------------------|
|         Id        |     Category     |
|-------------------|------------------|
|        1850       |      10,11       |
|-------------------|------------------|
|        1851       |      1,2,3       |
|-------------------|------------------|

我正在传递一个逗号分隔的字符串(例如1,11),以如下所示从该表中进行搜索,但这并没有给我传递多个值的结果:

Declare @SearchTerm NVARCHAR(4000) = '11'
Select Id,ImageCategory from AppImage
WHERE (',' + RTRIM(ImageCategory) + ',')  LIKE '%,' + @SearchTerm + ',%'  

如果我仅传递一个像1或11这样的值,那么它将给出结果。如何传递多个并获得结果。该表中有50万条记录和20列,所以我也需要提高速度。

2 个答案:

答案 0 :(得分:1)

修复您的数据模型!在字符串中存储多个整数只是错误,错误,错误:

  • 错误,因为数字应存储为数字,而不是字符串。
  • 错误,因为字符串只能存储一个值。
  • 错误,因为SQL的字符串处理功能差。
  • 错误,因为数据应存储在中而不是单个中。

有时候我们会被别人的错误决定所困扰。

您可以解决此问题。 SQL Server提供了string_split()

with input as (
      select value
      from string_split(@SearchTerm, ',') 
     )
select ai.*
from AppImage ai 
exists (select 1
        from string_split(ai.category)
        where value in (select i.value from input i)
       );

答案 1 :(得分:0)

尝试以下操作:

Declare @SearchTerm NVARCHAR(4000) = '1,11'
declare @SearchTerm1 NVARCHAR(10)
declare @SearchTerm2 NVARCHAR(10)
set @SearchTerm1=left(@SearchTerm, charindex(',', @SearchTerm) - 1)
set @SearchTerm2=right(@SearchTerm, charindex(',', @SearchTerm))
Select Id,ImageCategory from AppImage
WHERE RTRIM(ImageCategory)  LIKE '%' + @SearchTerm1 + '%' or RTRIM(ImageCategory) like '%' + @SearchTerm2 + '%'