初めに
Qiita Engineer Festa 2024に参加中。完走目指してます。
他のバックスラッシュコマンドについては以下から読んでください。
【PostgreSQL】バックスラッシュコマンドを纏めていく
\ifとは
合わせて以下の説明もしています。
\elif expression
\else
\endif
このコマンド群は入れ子にすることができる条件ブロックを実現します。 条件ブロックは
\if
で始まり、\endif
で終わらなければなりません。 その間には\elif
句をいくつでも置くことができ、さらにその後に\else
句を1つだけ置くことができます。 条件ブロックを構成するコマンドの間には、通常の問い合わせや他の種類のバックスラッシュコマンドを置くことができます(通常は置きます)。
\if
コマンドおよび\elif
コマンドはその引数を読み取り、それを論理式であるとして評価します。 式の結果がtrue
であれば、通常通りに処理が続きますが、そうでないときは、対応する\elif
、\else
または\endif
に到達するまで行をスキップします。 ひとたび\if
または\elif
の評価が真になったら、同じブロック内のそれより後にある\elif
コマンドの引数は評価されず、偽であるとして扱われます。\else
より後にある行は、それより前の対応する\if
と\elif
が一つも真にならなかった時にのみ実行されます。
\if
コマンドおよび\elif
コマンドの*expression*
引数は、他のバックスラッシュコマンドの引数と同様、変数置換と逆引用符展開の対象となります。 その後で、on/offのオプション変数の値のように評価されます。 従って有効な値は、true
、false
、1
、0
、on
、off
、yes
、no
のいずれかに曖昧性なしに、大文字小文字を区別せずにマッチするものです。 例えば、t
、T
、tR
はすべてtrue
であるとみなされます。真にも偽にも適切に評価できない式には警告を発行し、偽として扱います。
スキップされる行も、問い合わせとバックスラッシュコマンドを特定するため、通常通り解析されますが、問い合わせはサーバには送信されず、条件コマンド(
\if
、\elif
、\else
、\endif
)以外のバックスラッシュコマンドは無視されます。 条件コマンドは入れ子の有効性の確認のためだけに検査されます。 スキップされる行の変数参照は展開されず、逆引用符の展開も実行されません。条件ブロック内のすべてのバックスラッシュコマンドは同じファイル内になければなりません。 ファイル内のすべての
\if
ブロックが閉じられるより前に、メインの入力ファイルまたは\include
されたファイルの終端に到達した場合、psqlはエラーを発生させます。
試してみた
以下をif.sqlとして作成
usesは既に作成済みである
SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'users') AS users_exists
\gset
\if :users_exists
\echo 'Table users exists'
\else
\echo 'Table users does not exists'
\endif
実行してみる
psql -f if.sql
結果が返ってきた
Table users exists
ちなみに以下のような条件を指定、実行すると、、
\if :value = 1
Errorになってしまう。。。
psql:if.sql:3: error: unrecognized value "1 = 1" for "\if expression": Boolean expected
どうやら\ifに比較はかけなさそう
参考:https://qiita.com/nuko_yokohama/items/f736454315a80fa96850#expressionに数式を指定してみる
まとめ
実務での利用はしたことないが、どのよう活かせるか。。
すぐには思いつかなかったです。
何かできそうだけど、なんだろうか。