sql >> データベース >  >> RDS >> PostgreSQL

一致した配列要素を除外する

    XORのようです アレイ間:

    WITH set1 AS
    (
     SELECT * FROM unnest('{1, 2, 5, 15}'::int[])
    ), set2 AS
    (
     SELECT * FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
    ), xor AS
    (
      (SELECT * FROM set1
       UNION 
       SELECT * FROM set2)
      EXCEPT
      (SELECT * FROM set1
       INTERSECT 
       SELECT * FROM set2)
    )
    SELECT array_agg(unnest ORDER BY unnest)
    FROM xor
    

    出力:

    "{3,5,6,7,9}"
    

    仕組み:

    1. 両方のアレイのネストを解除します
    2. SUMを計算する
    3. INTERSECTを計算する
    4. SUMから-INTERSECT
    5. 配列に結合

    または、両方のマイナス(例外)演算の合計を使用することもできます:

    (A+B) - (A^B)
    <=>
    (A-B) + (B-A)
    

    FULL JOINを利用する :

    WITH set1 AS
    (
     SELECT *
    FROM unnest('{1, 2, 5, 15}'::int[])
    ), set2 AS
    (
     SELECT *
     FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
    )
    SELECT array_agg(COALESCE(s1.unnest, s2.unnest) 
                     ORDER BY COALESCE(s1.unnest, s2.unnest))
    FROM set1 s1
    FULL JOIN set2 s2
      ON s1.unnest = s2.unnest
    WHERE s1.unnest IS NULL
      OR s2.unnest IS NULL;
    

    編集:

    2番目の配列の要素だけが必要な場合は、最初に単純なEXCEPTを使用します。 :

    SELECT array_agg(unnest ORDER BY unnest)
    FROM (SELECT * FROM unnest('{1, 2, 3, 6, 7, 9, 15}'::int[])
          EXCEPT
          SELECT * FROM unnest('{1, 2, 5, 15}'::int[])) AS sub
    

    出力:

    "{3,6,7,9}"
    


    1. mysqlテーブルに格納できる行数を制限するにはどうすればよいですか?

    2. Mysql:NOTEXISTSを実行します。パフォーマンスを向上させることは可能ですか?

    3. プロシージャ/関数を使用せずにMySQLでループを実行できますか?

    4. PHP MySql:ツリーの印刷-親子チェックボックス