【问题标题】:How to select from string array added in SQL column?如何从 SQL 列中添加的字符串数组中进行选择?
【发布时间】:2020-04-05 12:53:40
【问题描述】:

下面是我的桌子,

create table t(
   id int,
   colParam varchar(max))

insert into t values(1,'["param1", "param2"]')
insert into t values(2,'["param2"]')
insert into t values(3,'["param1"]')
insert into t values(4,'["param2", "param3"]')
insert into t values(5,'["param1", "param2"]')

试过

declare @str varchar(max) = 'param1'; Select * from t where colParam like '%'+ @str+'%'

它不适合

declare @str varchar(max) = 'param1,param2'; Select * from t where colParam like '%'+ @str+'%'

我想通过传递colPar as 'param1,param2' 来选择行,所以它会导致我在 colParam 中包含 param1 和 param2 的所有记录

【问题讨论】:

  • 所以根据您的示例数据,它应该只返回 ID=1 和 5?
  • 不,我应该全部返回,因为 param1 和 param2 存在于所有记录中。当我说 param3 它应该返回 Id =4,在 param1 上它应该返回 Id =1,3,5

标签: sql arrays select where-clause sql-like


【解决方案1】:

这个安静的棘手。

create table #t(
    id int,
    colParam varchar(max)
)

insert into #t values(1,'["param1", "param2"]')
insert into #t values(2,'["param2"]')
insert into #t values(3,'["param1"]')
insert into #t values(4,'["param2", "param3"]')
insert into #t values(5,'["param1", "param2"]')

declare @str varchar(max) = 'param1,param2';     

返回所有匹配值。

select distinct id, t1.colParam  from #t t1
cross apply string_split(t1.colParam, ',') t2
cross apply string_split(@str, ',') t3
where t2.value like '%'+t3.value+'%'

输出:

【讨论】:

  • 我之前尝试过使用交叉应用,但在查询中只使用了一次。您的努力解决了我的疑问和时间。谢谢。
【解决方案2】:

如果您使用的是 SQL Server 2016 及更高版本,则可以使用STRING_SPLIT

As MSDN says:

一个表值函数,将字符串拆分为多行子字符串, 基于指定的分隔符。

所以你可以看起来像这样:

DECLARE @t TABLE
(
    id int,
    colParam varchar(max)
)

insert into @t values(1,'["param1", "param2"]')
insert into @t values(2,'["param2"]')
insert into @t values(3,'["param1"]')
insert into @t values(4,'["param2", "param3"]')
insert into @t values(5,'["param1", "param2"]')

SELECT 
  t.id
, s.col
FROM @t AS t
OUTER APPLY
(
    SELECT 
    spl.value AS col
    FROM STRING_SPLIT(
        (SELECT _t.colParam FROM @t AS _t WHERE _t.id = t.id), ',') AS spl
 )s

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多