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

3つのIDで検出されたすべての一意の組み合わせを継続的に挿入します

    @a_horse_with_no_nameがすでに述べたように、unnest()関数は、最初の次元だけでなく、ネストされたすべての要素を平坦化します。したがって、整数ごとに1つの行が作成されます。もちろん、(あなたの場合は)6つの値を持つ1つの列になります。これが例外メッセージの意味です。1つの列を生成しましたが、3つが予期されていました。

    したがって、最初の次元のみを解き明かすソリューションが必要です。 こちら で提示されているソリューションを使用しています :

    demo:db <> fiddle

    Lukasの関数の作成:

    CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
      RETURNS SETOF anyarray AS
    $func$
    SELECT array_agg($1[d1][d2])
    FROM   generate_subscripts($1,1) d1
        ,  generate_subscripts($1,2) d2
    GROUP  BY d1
    ORDER  BY d1
    $func$  LANGUAGE sql IMMUTABLE;
    

    これは最初の次元のみをネスト解除しています。したがって、関数内でunnest()を試す代わりに使用できます:

    CREATE OR REPLACE function create_combinations_if_needed(p_combinations integer[][]) RETURNS boolean
    LANGUAGE sql AS
    $$
       INSERT INTO combinations (some_id1, some_id2, some_id3)
       SELECT unnest[1], unnest[2], unnest[3]
       FROM unnest_2d_1d(p_combinations) as unnest
       ON CONFLICT (some_id1, some_id2, some_id3)
       DO NOTHING
       RETURNING TRUE;
    $$;
    



    1. InterfaceError(0、'')

    2. MySQLテーブルは存在しませんエラーですが、存在します

    3. Volleyの呼び出し時にPHP500内部サーバーエラーが発生しました

    4. クラスDAOに同じ結果を使用するメソッドがある場合に、クエリの数を減らすための最良の方法は何ですか?