PostgreSQL配列の値の位置を取得する方法はありますか? Pythonには.index()
メソッドがあり、PHPにはarray_search()
ファンクションがありますが、PostgreSQLでこのような関数を見つけることはできません。それを行うストアドファンクションを作成する必要がありますか?私は、組み込み関数を使用して解決することを好む。PostgreSQL配列の値の位置を見つける
16
A
答えて
9
Since version 9.5には、配列キー(最初のオカレンスのみ)またはキー(すべてのオカレンス)を値で検索するための関数array_position()
およびarray_positions()
が組み込まれています。
これらの関数はanyarray型をサポートしています。
27
documentation recommendsgenerate_subscripts
機能を使用しています。エミュレートのPHPのarray_search
以下の機能:存在する場合
CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY)
RETURNS INT AS $$
SELECT i
FROM generate_subscripts($2, 1) AS i
WHERE $2[i] = $1
ORDER BY i
$$ LANGUAGE sql STABLE;
これは、最初のマッチのインデックスを返します。すべてのマッチが必要な場合は、RETURNS INT
をRETURNS SETOF INT
に変更するだけです。この関数は、一致するものが見つからない場合はNULL
を返します。
この関数は、1次元配列でのみ機能します。
また、array_search(NULL, a)
は常に配列がnullの要素が含まれていても、NULL
を返すことを念頭に置いてクマ:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
SQLはNULL = NULL
が不明(すなわちNULL
)であると見なしためです。 functions-comparisonを参照してください。あなたはarray_search
はNULL
要素を見つけることができるようにしたい場合は、
WHERE $2[i] IS NOT DISTINCT FROM $1
4
に
WHERE $2[i] = $1
を変更するにはidx
function from the intarray
bundled extension大幅に高速化を使用することができます。
この関数は、すべての配列型をサポートするようには一般化されていませんが、残念ながら、他の配列に対しては非常に遅いSQLアプローチを採用しています。
関連する問題
- 1. 配列のPHPの単語の位置を見つける
- 2. 配列内の最小要素の位置を見つける
- 3. Javaで要素位置の配列を見つける
- 4. PostgreSQLの配列列内の文字列を見つける
- 5. 配列のリストの各位置で順位をつける - Python
- 6. 配列内の値を見つける
- 7. 配列内の特定の数字の位置を見つける方法は?
- 8. QGraphicsItemのスクリーン位置を見つける
- 9. PHP:多次元配列のキーの正確な位置を見つける
- 10. jQueryは私のページのスクロール値(オフセット位置)を見つける
- 11. 2次元配列の最大値と最小値の位置を見つける方法
- 12. 配列内の位置/インデックスでドキュメントを見つける方法は?
- 13. 文字列内の文字の位置を見つける
- 14. 文字列のコンソールエスケープコードの位置を見つける
- 15. リスト内の文字列の位置を見つけるC#
- 16. Pythonが行の位置を行列に見つける
- 17. Pythonが文字列の位置を見つける
- 18. Cocos2d - CCMoveBy - スプライト位置を見つける
- 19. カーソル位置を見つける
- 20. 位置と向きを見つける
- 21. この場合、配列の中で最大値の位置を見つける方法は?
- 22. matlab image uint8最左/上/下/右ピクセル位置を見つける配列
- 23. 配列値の位置を見つけようとするとインデックスエラーが発生する
- 24. ポインタで配列の最大数を見つけてその位置を別の配列に移動
- 25. 文字列内の文字列の配列の最初の位置を見つける
- 26. 配列内の値を1つずつ見つける
- 27. 仮想キーボードの最上位ピクセル位置を見つける?
- 28. 8 * 720配列の各列の最小値を見つける?
- 29. 同じポイントで3つの配列の値を見つける
- 30. 要件別行列位置を見つける
+1 for generate_subscripts()と非常に完全な答えです。 –
良い答え。 PostgreSQL 9.4で 'WITH ORDINAL'関数が追加されたときに、' unnest(the_array)WITH ORDINAL'と書くだけで、よりシンプルで効率的になります。たぶん私は9.4用の適切な 'idx'関数を書いて提出するべきです... –