Postgres:if-else 条件取决于提示,在通过 \i 调用的 .sql 文件中

Posted

技术标签:

【中文标题】Postgres:if-else 条件取决于提示,在通过 \\i 调用的 .sql 文件中【英文标题】:Postgres: if-else condition depending on prompt, in .sql file called via \iPostgres:if-else 条件取决于提示,在通过 \i 调用的 .sql 文件中 【发布时间】:2019-10-16 07:03:54 【问题描述】:

使用 Postgres 10.10,这就是我想要完成的任务。我想要一个test.sql 脚本文件(由\i /path/test.sql 执行),其代码执行取决于用户在初始提示后输入的内容。

例如,对于下面的代码,我想回显一些文本并创建一个表,但回显的文本和表名应该取决于用户传递的文本作为提示的输入:

\prompt 'What is your favourite color?' answer
IF ('blue' = :answer) THEN
    \echo 'It is blue! :) '
    CREATE TABLE blue;
ELSE
    \echo 'It is something else. :( '
    CREATE TABLE :answer;
END IF;

但是,一些错误导致它无法正常工作:

myuser=# \i /home/myuser/test.sql
你最喜欢的颜色是什么?红色
它是蓝色的! :)
psql:/home/myuser/test.sql:4:错误:“IF”或附近的语法错误
第 1 行:如果(“蓝色”= 红色)那么
        ^
这是另外一回事。 :(
psql:/home/myuser/test.sql:7:错误:“ELSE”或附近的语法错误
第 1 行:否则
        ^
psql:/home/myuser/test.sql:8:错误:“IF”或附近的语法错误
第 1 行:如果结束;
            ^
我的用户=#

请注意,这与https://dba.stackexchange.com/questions/207666/how-do-i-use-the-input-from-a-prompt-in-a-conditional-if 中的要求不同。此外,我尝试对其进行调整以遵循Postgres syntax error at or near "IF" 中的答案,但随后我得到了更多错误,从“'DO' 处或附近的语法错误”开始。

有没有办法让我完成这项任务?也就是说,每次用户使用\i 执行test.sql 文件时,都会提示用户,并且文件内代码的执行会根据用户通过提示输入的文本进行分支?

【问题讨论】:

SQL 中没有IF。但是psql 提供了一个\if postgresql.org/docs/current/app-psql.html#PSQL-METACOMMAND-IF @a_horse_with_no_name 唯一的问题是如何将answer == 'blue' 转换为布尔值以与\if 一起使用。我只在dba.stackexchange.com/questions/207666/… 中看到对此类问题的引用,但该答案在这里没有帮助 【参考方案1】:

类似这样的:

SELECT :'answer' = 'blue' AS isblue \gset
\if :isblue
   ...
\endif

【讨论】:

以上是关于Postgres:if-else 条件取决于提示,在通过 \i 调用的 .sql 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何对返回类型取决于参数的输入类型的函数进行类型提示?

if - else 语句

if-else 中的值 [重复]

if-else

如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?

2.4 if-else