0

我想从完整的表列表中检索某些记录。在这里,我使用带有 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,','))

感谢你的帮助!

4

2 回答 2

2

虽然这可以实现,但我会要求您重新考虑您的数据模型。在数据库中存储逗号分隔的 ids/references 列表是个坏主意。我强烈支持蒂姆·比格莱森的评论

替代方法是将区域标题列表存储在单独的表中。

这是实现此目的的一种方法

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 |
+---------------------+-----------+-------+

dbfiddle 链接 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1cc9b224e443369744df19c1d7a7d789

于 2020-07-03T06:44:20.433 回答
0

蒂姆是 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
             );

推荐这种方法。我只是建议将其作为权宜之计,直到您可以修复数据模型。

于 2020-07-03T12:16:44.930 回答