如何从返回的子查询中选择没有值的记录(具有逗号分隔的值)?

时间:2019-02-25 11:41:07

标签: sql apache-spark-sql

更新 SQL FIDDLE链接https://www.db-fiddle.com/f/9t63on5kYWUNrHqXkThb1P/4

输出应仅给出以下内容(表1的第2行)

I0016,I0028,I0045,I0056,I0215,I0321,I0361,I0369,I0420

我应该

select column1 from table1 
where <any comma separated value in column1> not in
(select col2 from table2 where col1 = 'e')

首选解决方案是本机SQL,并且不针对任何供应商。如有必要,可提供Spark sql函数帮助。

注意:我知道这是不好的设计,但这是我无法控制的。

注意 FIDDLE中的表是使用MySQL的默认设置创建的。我不知道如何在后端创建表。这就是为什么我指定这不应该是特定于供应商的原因。

2 个答案:

答案 0 :(得分:0)

您应该修复您的数据结构!在单列中存储值列表不是在SQL中存储数据的适当方法。您应该使用联结/关联表。

您可以使用not exists做您想做的事情:

select t1.column1
from table1 t1
where not exists (select 1
                  from table2 t2
                  where ',' || t1.column || ',' like '%,' || t2.value || ',%'
                 )

SparkSQL也可能支持find_in_set(),在这种情况下,您可以这样做:

select t1.column1
from table1 t1
where not exists (select 1
                  from table2 t2
                  where find_in_set(t1.column, t2.value) > 0
                 )

Here是db <>小提琴。

答案 1 :(得分:0)

以下相关子查询适用于我的情况。可以在上面的小提琴中进行测试。

select *
from table1 as t1
where (
    select  t2.col2
    from    table2  as  t2
    where   t1.column1 like concat('%', t2.col2 ,'%')
    and t2.col1 = 'e'
    limit 1
    ) is NULL;