Postgres で配列が空かどうかを確認する方法
2023-08-21 23:14:42
質問
Postgresの関数があります。
CREATE OR REPLACE FUNCTION get_stats(
_start_date timestamp with time zone,
_stop_date timestamp with time zone,
id_clients integer[],
OUT date timestamp with time zone,
OUT profit,
OUT cost
)
RETURNS SETOF record
LANGUAGE plpgsql
AS $$
DECLARE
query varchar := '';
BEGIN
... -- lot of code
IF id_clients IS NOT NULL THEN
query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;
... -- other code
END;
$$;
というわけで、こんな感じのクエリを実行すると。
SELECT * FROM get_stats('2014-07-01 00:00:00Etc/GMT-3'
, '2014-08-06 23:59:59Etc/GMT-3', '{}');
生成されたクエリにはこのような条件があります。
"... AND id = ANY('{}')..."
しかし、配列が空の場合、この条件はクエリで表現されるべきではありません。
クライアントの配列が空でないことを確認するにはどうしたらよいでしょうか。
2つのバリエーションも試しました。
IF ARRAY_UPPER(id_clients) IS NOT NULL THEN
query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;
そして
IF ARRAY_LENGTH(id_clients) THEN
query := query||' AND id = ANY ('||quote_nullable(id_clients)||')';
END IF;
どちらの場合も、こんなエラーが出ました。
ARRAY_UPPER(ARRAY_LENGTH) doesn't exists
;
どのように解決するのですか?
array_length()
が必要です。
2
パラメータが必要で、2つ目は配列の次元です。
array_length(id_clients, 1) > 0
だから
IF array_length(id_clients, 1) > 0 THEN
query := query || format(' AND id = ANY(%L))', id_clients);
END IF;
これは、空の配列 と NULLを除く。
あるいは
cardinality()
を Postgres 9.4 以降で使用します。
bronzenose さんの追加回答を参照してください。
しかし、もしクエリを連結して実行するのであれば、そのクエリを
EXECUTE
で値を渡すのであれば
USING
節で値を渡す方が賢明です。例
ちなみに、明示的に 配列が空かどうかを明示的にチェックするには を明示的にチェックすることができます (タイトルにあるように - しかしそれは ではなく ではありません)、空の配列と比較するだけです。
id_clients = '{}'
以上です。得ることができます。
TRUE
... 配列は空です
NULL
... 配列はNULLです。
FALSE
... その他の場合(配列に要素がある - たとえそれがNULL要素でも)。
関連
-
MySQL - ストアドプロシージャ (データ型、関数)
-
windows mysql prompt access denied for user ''@'localhost' to database.
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] JavaScriptで配列を空にするにはどうしたらいいですか?
-
[解決済み】配列に何かを追加する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
executeQuery()ソリューションでデータ操作文を発行できない。
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] SQL Server の VARCHAR/NVARCHAR 文字列に改行を挿入する方法
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?