2

パス ( '/11/22/33/44') を表す文字列列が指定された場合、指定された番号の次の番号を返すにはどうすればよいですか。

例えば:

  • id= を指定すると、 path22から戻りたいです。33/11/22/33/44/
  • id= を指定すると、 path44から戻りたいです。NULL/11/22/33/44/

これは、文字列を一連のレコードに変換するために使用するビットです。

SELECT unnest(string_to_array(trim(both '/' from '/11/22/33/44/'), '/')::integer[]);
 unnest 
--------
     11
     22
     33
     44
(4 rows)

しかし、ここで「次のエントリ」を取得する方法2233?

4

1 に答える 1

2

1 つの方法はウィンドウ関数です。

SELECT a FROM (
    SELECT *, lag(a) OVER () AS lag_1
    FROM unnest(string_to_array(trim(both '/' from '/11/22/33/44/'), '/')::integer[]) a
) b WHERE lag_1 = 22;

このソリューションは、44入力に対してゼロ行を返しますが、サブクエリとして呼び出すことで簡単に対処できます。

または、整数配列の場合は、intarray 拡張機能のidx関数を使用できます。

CREATE EXTENSION intarray;

WITH x(arr) AS (
    SELECT string_to_array(trim(both '/' from '/11/22/33/44/'), '/') :: integer[]
)
SELECT arr[idx(arr,22)+1] FROM x;

配列内の次のインデックスを検索します。intarrayPostgreSQL と共に配布される拡張機能であり、サードパーティのアドオンではありません。このソリューションは、それ以上の操作なしで のNULL結果を生成します。44

于 2012-10-15T01:03:22.043 に答える