3

私はOracleで以下のクエリを持っています:

SELECT to_number(a.v_VALUE), b.v_VALUE
       FROM TABLE(inv_fn_splitondelimiter('12;5;25;10',';')) a
       JOIN TABLE(inv_fn_splitondelimiter('10;20;;', ';')) b
         ON a.v_idx = b.v_idx

次のような結果が得られます。

ここに画像の説明を入力

クエリを Postgres に変換したい。次のようなクエリを試しました:

SELECT UNNEST(String_To_Array('10;20;',';'))

私も試しました:

SELECT a,b
       FROM (select  UNNEST(String_To_Array('12;5;25;10;2',';'))) a
       LEFT JOIN (select  UNNEST(String_To_Array('12;5;25;10',';'))) b
         ON a = b

しかし、正しい結果は得られませんでした。
Oracle版と完全に同等なクエリの書き方がわかりません。誰?

4

2 に答える 2

3

select aaは、 は列ではなく、テーブル エイリアスの名前です。したがって、その式は、単一の列ではなく、完全な行タプル (ただし、単一の列のみ) を選択します。

派生テーブルに適切な列エイリアスを定義する必要があります。選択リストではなく、from 句でのみ set を返す関数を使用することもお勧めします。

9.4 を使用していない場合は、ウィンドウ関数を使用して「インデックス」を生成する必要があります。9.4 を使用している場合は、Erwin の回答の方がはるかに優れています。

SELECT a.v_value, b.v_value
FROM (
   select row_number() over () as idx,  -- generate an index for each element
          i as v_value
   from UNNEST(String_To_Array('12;5;25;10;2',';')) i
) as a 
  JOIN (
     select row_number() over() as idx, 
            i as v_value
     from UNNEST(String_To_Array('10;20;;',';')) i
  ) as b 
  ON a.idx = b.idx;

9.4 での別の方法はwith ordinality、インデックス値が必要な場合に行インデックスを生成するオプションを使用することです。

select a.v_value, b.v_value
from regexp_split_to_table('12;5;25;10;2',';') with ordinality as a(v_value, idx)
  left join regexp_split_to_table('10;20;;',';') with ordinality as b(v_value, idx) 
    on a.idx = b.idx
于 2015-02-13T07:49:08.357 に答える