LoginSignup
0
0

初めに

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のオプション変数の値のように評価されます。 従って有効な値は、truefalse10onoffyesnoのいずれかに曖昧性なしに、大文字小文字を区別せずにマッチするものです。 例えば、tTtRはすべてtrueであるとみなされます。

真にも偽にも適切に評価できない式には警告を発行し、偽として扱います。

スキップされる行も、問い合わせとバックスラッシュコマンドを特定するため、通常通り解析されますが、問い合わせはサーバには送信されず、条件コマンド(\if\elif\else\endif)以外のバックスラッシュコマンドは無視されます。 条件コマンドは入れ子の有効性の確認のためだけに検査されます。 スキップされる行の変数参照は展開されず、逆引用符の展開も実行されません。

条件ブロック内のすべてのバックスラッシュコマンドは同じファイル内になければなりません。 ファイル内のすべての\ifブロックが閉じられるより前に、メインの入力ファイルまたは\includeされたファイルの終端に到達した場合、psqlはエラーを発生させます。

\ifについて

試してみた

以下を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に数式を指定してみる

まとめ

実務での利用はしたことないが、どのよう活かせるか。。
すぐには思いつかなかったです。
何かできそうだけど、なんだろうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0