如何在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中检查表中是不是存在所有元素?的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中如何快速查询某条记录在所有表中是不是存在?

如何使用 python pyodbc 检查表中是不是存在列?

SQL 连接两个表并检查两个表中的每个值是不是存在

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

如何检查Mysql中是不是存在数组元素?

如何检查表中是不是存在值?