如何使用逗号分隔的值和in子句检索记录?

djp7away  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(270)

我想从表的完整列表中检索某些记录。这里我使用逗号分隔的值和in子句。表行如下所示:

这是我的sql查询,但查询完成时结果集为空`

DECLARE @input VARCHAR(1000) = '2,3,17,10,16'
SELECT * FROM locations
WHERE
  east_zone in (SELECT VALUE FROM string_split(@input,','))
OR 
west_zone in (SELECT VALUE FROM string_split(@input,','))

谢谢你的帮助!

3zwtqj6y

3zwtqj6y1#

虽然这是可以完成的,但我要求您重新考虑您的数据模型。在数据库中存储以逗号分隔的id/引用列表是个坏主意。我非常赞同蒂姆·比盖莱森的评论
另一种方法是将区域标题列表存储在一个单独的表中。
这里有一个方法来实现这一点

with data
  as (select 'model_check_holding' as col1,'1,2,3,4,5' as str union all
      select 'model_cash_holding'  as col1,'5,8,9' as str 
     )
    ,split_data
     as (select *
           from data
         cross apply string_split(str,',') 
        )
     ,user_input
      as(select '2,8,1' as input_val)
select *
 from split_data
where value in (select x.value 
                 from user_input 
                 cross apply string_split(input_val,',') x
                ) 
+---------------------+-----------+-------+
|        col1         |    str    | value |
+---------------------+-----------+-------+
| model_check_holding | 1,2,3,4,5 |     1 |
| model_check_holding | 1,2,3,4,5 |     2 |
| model_cash_holding  |     5,8,9 |     8 |
+---------------------+-----------+-------+

D小提琴连杆https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1cc9b224e443369744df19c1d7a7d789

pvabu6sv

pvabu6sv2#

蒂姆110%正确。您的数据模型完全是一团糟——不仅仅是在一个分隔字符串中存储多个值。但也把数字串成字符串。错,错,错。
但是,如果你被其他一些非常,非常,非常糟糕的设计选择所困扰,你确实有一个选择:

DECLARE @input VARCHAR(1000) = '2,3,17,10,16';

SELECT l.*
FROM locations l
WHERE EXISTS (SELECT 1
              FROM string_split(@input, ',') s1 JOIN
                   string_split(concat(l.east_zone, ',', l.west_zone), ',') l
                   ON s1.value = l.value
             );

我不推荐这种方法。我只是建议您在修复数据模型之前将其作为权宜之计。

相关问题