如果未在命令行中指定,则仅在psql脚本中设置变量

时间:2015-09-15 09:34:45

标签: postgresql psql

我想给选项在命令行中为我的psql脚本指定一些变量。

 psql -v myVar=myValue

但是我发现无法在sql-script本身中提供这些变量的默认值。语法:

`\set MyVar defaultValue` 

无条件地覆盖psql命令行中指定的值myValue

有没有办法检查psql中是否设置了变量?

2 个答案:

答案 0 :(得分:7)

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允许您从选择查询的结果中设置变量。结果变量的名称与列名相同,这就是在查询结束时需要子句AS "myVar"的原因(如果要使用带大写字母的变量名,请不要忘记双引号)。

例如命令:

SELECT 'hello' AS var1 \gset

将变量var1设置为hello,与

相同
\set var1 hello

有关更多信息,请参阅此处:http://www.postgresql.org/docs/9.4/static/app-psql.html

答案 1 :(得分:2)

来自 Tom-db 的答案很好,但与 /prompt 一起使用时不起作用

要在用户按 Enter 键而不添加任何内容来响应 /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';