如果未在命令行中指定,则仅在 psql 脚本中设置变量
only set variable in psql-script if not specified on the command-line
我想提供 选项 以在命令行上为我的 psql-脚本指定一些变量。
psql -v myVar=myValue
但是我发现无法在 sql-脚本本身中为这些变量提供默认值。语法:
\set MyVar defaultValue
无条件地覆盖在 psql 命令行上指定的值 myValue
。
有什么方法可以检查 psql 中是否设置了变量?
psql 不支持设置变量的默认值,但您可以使用变通方法。
这个psql命令:
\set myVar :myVar
如果变量已经通过 psql 设置(这意味着,myVar 再次设置为他的值),则什么都不做,否则变量按字面设置为字符串 :myVar
.
使用这种情况和其他 psql 命令 \gset
,您实际上可以为 myVar 设置一个默认值。把这个放在你的上面 sql 脚本:
\set myVar :myVar
-- now myVar is set to the string ':myVar' if was not already set.
-- Checking it using a CASE statement:
SELECT CASE
WHEN :'myVar'= ':myVar'
THEN 'default_value'
ELSE :'myVar'
END AS "myVar" \gset -- < \gset call at end of the query
它似乎只适用于文本变量,但如果你需要数字变量,你可以转换为数字:
SELECT CASE
WHEN :'myVar'= ':myVar'
THEN '10'
ELSE :'myVar'
END::numeric AS "myVar" \gset
\gset 是如何工作的:
\gset
允许您根据 select 查询的结果设置变量。结果变量的命名类似于列名,这就是为什么在查询末尾需要 AS "myVar"
子句(如果要使用大写字母的变量名称,请不要忘记双引号)。
例如命令:
SELECT 'hello' AS var1 \gset
设置变量var1
为hello
,同
\set var1 hello
查看此处了解更多信息:http://www.postgresql.org/docs/9.4/static/app-psql.html
Tom-db 的答案很好,但与 /prompt
一起使用时不起作用
要在用户按下回车键而不添加任何响应 /prompt 的情况下使用此功能,请不要使用 \set myVar :myVar
部分,只需使用:
\prompt "Please provide value " myVar
/*user hits enter */
SELECT CASE
WHEN :'myVar'= ''
THEN 'default_value'
ELSE :'myVar'
END AS "myVar" \gset
select :'myVar';
从 psql 版本 11 开始,您可以这样做
\if :{?myVar}
\else
\set myVar default_value
\endif
\echo myVar is :'myVar'
参见“元命令”documentation。
我想提供 选项 以在命令行上为我的 psql-脚本指定一些变量。
psql -v myVar=myValue
但是我发现无法在 sql-脚本本身中为这些变量提供默认值。语法:
\set MyVar defaultValue
无条件地覆盖在 psql 命令行上指定的值 myValue
。
有什么方法可以检查 psql 中是否设置了变量?
psql 不支持设置变量的默认值,但您可以使用变通方法。
这个psql命令:
\set myVar :myVar
如果变量已经通过 psql 设置(这意味着,myVar 再次设置为他的值),则什么都不做,否则变量按字面设置为字符串 :myVar
.
使用这种情况和其他 psql 命令 \gset
,您实际上可以为 myVar 设置一个默认值。把这个放在你的上面 sql 脚本:
\set myVar :myVar
-- now myVar is set to the string ':myVar' if was not already set.
-- Checking it using a CASE statement:
SELECT CASE
WHEN :'myVar'= ':myVar'
THEN 'default_value'
ELSE :'myVar'
END AS "myVar" \gset -- < \gset call at end of the query
它似乎只适用于文本变量,但如果你需要数字变量,你可以转换为数字:
SELECT CASE
WHEN :'myVar'= ':myVar'
THEN '10'
ELSE :'myVar'
END::numeric AS "myVar" \gset
\gset 是如何工作的:
\gset
允许您根据 select 查询的结果设置变量。结果变量的命名类似于列名,这就是为什么在查询末尾需要 AS "myVar"
子句(如果要使用大写字母的变量名称,请不要忘记双引号)。
例如命令:
SELECT 'hello' AS var1 \gset
设置变量var1
为hello
,同
\set var1 hello
查看此处了解更多信息:http://www.postgresql.org/docs/9.4/static/app-psql.html
Tom-db 的答案很好,但与 /prompt
一起使用时不起作用要在用户按下回车键而不添加任何响应 /prompt 的情况下使用此功能,请不要使用 \set myVar :myVar
部分,只需使用:
\prompt "Please provide value " myVar
/*user hits enter */
SELECT CASE
WHEN :'myVar'= ''
THEN 'default_value'
ELSE :'myVar'
END AS "myVar" \gset
select :'myVar';
从 psql 版本 11 开始,您可以这样做
\if :{?myVar}
\else
\set myVar default_value
\endif
\echo myVar is :'myVar'
参见“元命令”documentation。