如何在sql中检查表中是不是存在所有元素?
Posted
技术标签:
【中文标题】如何在sql中检查表中是不是存在所有元素?【英文标题】:How to make check whether all elements exist in a table or not in sql?如何在sql中检查表中是否存在所有元素? 【发布时间】:2017-10-04 05:00:30 【问题描述】:我在 php 中有任何主题 ID 数组,比如说
['abc123', 'bcd3432', 'bla232', ....]
这是我在 sql oracle 中的错误尝试
select
*
from
subject_table
where
subject_id IN ('abc123', 'bcd3432', 'bla232'....)
如果有主题,则返回true
,否则返回false
我如何实现它?
【问题讨论】:
只有当所有三个主题都出现而不仅仅是一两个主题时,您才希望返回 True @JSapkota,目前,我不知道如何编写 sql,它只返回 true,当有 3 个主题时。 @Pரதீப்,我不知道怎么写sql。 Oracle sql return true if exists question的可能重复 或者这个***.com/questions/11681083/… 【参考方案1】:你需要一个不同的计数来知道是否所有的 subject_ids 都在哪里。
select case when count(distinct subject_id) = 3 then 'true' else 'false' end as status
from subject_table
where subject_id in('abc123', 'bcd3432', 'bla232')
【讨论】:
【参考方案2】:尝试:
select
case when count(1) > 0 then 'true' else 'false' end
from
subject_table
where
subject_id IN ('abc123', 'bcd3432', 'bla232')
【讨论】:
会试一试的。 这仅检查 any 元素是否存在于表中,而不检查 所有 元素是否存在于表中【参考方案3】:如果你设置 > 0 为真,0 为假,你可以这样选择:
select count(*) as Existed
from
subject_table
where
subject_id IN ('abc123', 'bcd3432', 'bla232'....)
【讨论】:
问题是,如果所有值都在表中。使用您的解决方案,您必须最终将结果count(*)
与提交的参数数量进行比较 'abc123', 'bcd3432' ...
这只有在 subject_id 是唯一的情况下才有效。【参考方案4】:
将数组作为集合传递:
CREATE OR REPLACE TYPE StringList IS TABLE OF VARCHAR2(20);
/
那么你可以这样做:
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM subject_table
WHERE StringList( 'abc123', 'bcd3432', 'bla232' )
SUBMULTISET OF
CAST( COLLECT( subject_id ) AS StringList )
)
THEN 'true'
ELSE 'false'
END AS has_all_ids
FROM DUAL;
您甚至可以使用bind parameter to pass the array in:
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM subject_table
WHERE :your_array
SUBMULTISET OF
CAST( COLLECT( subject_id ) AS StringList )
)
THEN 'true'
ELSE 'false'
END AS has_all_ids
FROM DUAL;
【讨论】:
【参考方案5】:你可以试试这个。这里我将包含所有元素的字符串拆分为一组行,并将其与主表与LEFT JOIN
进行比较
WITH given_sub
AS ( SELECT DISTINCT TRIM (REGEXP_SUBSTR ('abc123,bcd3432,bla232',
'[^,]+',
1,
LEVEL))
subject_id
FROM DUAL
CONNECT BY INSTR ('abc123,bcd3432,bla232',
',',
1,
LEVEL - 1) > 0)
SELECT CASE
WHEN COUNT (DISTINCT s.subject_id) < COUNT (DISTINCT g.subject_id)
THEN
'FALSE'
ELSE
'TRUE'
END
All_found
FROM given_sub g
LEFT OUTER JOIN subject_table s
ON s.subject_id = g.subject_id
AND s.subject_id IN ('abc123',
'bcd3432',
'bla232'
);
【讨论】:
以上是关于如何在sql中检查表中是不是存在所有元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python pyodbc 检查表中是不是存在列?