【问题标题】: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

我如何实现它?

【问题讨论】:

标签: sql oracle


【解决方案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'
                                        );
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2011-08-02
        • 2018-01-10
        • 2021-12-17
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多