問題を明確にする
質問すると、1 次元配列が表示されます。したがって、適切な列定義を使用してください。
ages int4range[]
混乱する以外に違いがあるわけではありません。マニュアルから配列型の宣言の章を引用します。
現在の実装では、宣言された次元数も強制されません。特定の要素型の配列は、サイズや次元数に関係なく、すべて同じ型であると見なされます。したがって、配列のサイズまたは次元数を宣言すること
CREATE TABLE
は、単なるドキュメントです。実行時の動作には影響しません。
また、質問自体があいまいです。元。:
INSERT INTO tbl(ages) VALUES ('{"[0,6)","[5,9)","[8,10)"}')
テスト: '{5,8,7}'::int[]
.
順番に適用すると、チェックは失敗します:
5
最初の範囲に適合します[0,6)
。
8
2 番目の範囲に適合します[5,9)
。
7
3 番目の範囲には適合しません[8,10)
。
ただし、異なる順序で適用する5,7,8
と、チェックは成功します。必要がある
- 重複しない間隔を保証します。
- または、定義された順序でチェックを適用します。
- いずれかの側の要素の数が常に一致することを明確にします。
最後に、何をしようとしているのかについての説明を質問に編集します。コメントで重要な情報を隠さないでください。
答え
コメントによると、上記のカタログから 1.、2.、および 3. を想定しています。このクエリは、指定された( )に適合するかどうかから、すべてages
( array of int4range
) をテストします。tbl
age_list
int[]
WITH tbl(id, ages) AS (
VALUES
(1, '{"[0,2)","[4,6)","[8,10)"}'::int4range[])
,(2, '{"[2,4)","[6,8)","[9,10)"}')
) -- stand-in for table
SELECT id, bool_and(i <@ r) AS passes_test
FROM (
SELECT id
,unnest('{1,5,9}'::int[]) AS i -- supply age_list here
,unnest(ages) AS r
FROM tbl
) AS sub
GROUP BY 1
戻り値:
id | passes_test
----+------------
1 | t
2 | f
主なポイント
CTEtbl
は、テーブルの単なる代用です。tbl
実際に存在する場合は削除できます。
2 つのunnest()
関数は、2 つの配列を並べてネスト解除します。id
行を識別するために (任意の一意の列)を追加します。
要素ごとに<@
演算子で範囲に含まれているか確認し、で再集計しbool_and
ます。TRUE
すべてのチェックが の場合にのみ を返しますTRUE
。