2

在 shell 中使用 CASE WHEN 语句触发 SQL 时,我遇到了一个奇怪的问题。

我的 SQL 看起来像:

insert into myschema.myTable (col1, col2, col3) 
select col1, 
         CASE 
            WHEN col2 = 'NULL' THEN NULL 
            ELSE col2 
         END, 
         col3 
from myschema.myTable_ext_table

(它正在从一个外部表加载数据,该表有一些提取为“NULL”字符串的 NULL 值,我们无法更改外部表设计)

我的目标是使用 nohup 运行 psql,以便大数据加载任务可以在后台运行。我的 psql 命令如下所示:

nohup  sh -c 'date;psql -h myHAWQHost -d myHAWQDB --command "insert into myschema.myTable (col1, col2, col3) select col1, CASE WHEN col2 = 'NULL' THEN NULL ELSE col2 END, col3 from myschema.myTable_ext_table";date;' > myLog.out &

当我从任何客户端(pgAdmin/Aginity)触发 SQL 时,它运行良好。但是,当从 psql 命令运行时,它不起作用,因为 CASE WHEN 仍在将“NULL”字符串放在col2列中。

4

2 回答 2

2

在 PostgreSQL 中,您可以使用自己的字符串限制器:

postgres=# select $$AHOJ$$;
 ?column? 
----------
 AHOJ
(1 row)

这些文字分隔符可以从 shell 使用

[pavel@localhost ~]$ sh -c 'psql postgres -c "select \$\$NULL\$\$"'
 ?column? 
----------
 NULL
(1 row)

[pavel@localhost ~]$ sh -c 'psql postgres -c "select \$\$$USER\$\$"'
 ?column? 
----------
 pavel
(1 row)
于 2014-01-30T16:52:40.893 回答
1

你有一个报价问题。为了将单引号 ( ') 嵌入同样用单引号括起来的 shell 字符串中,您需要切换到双引号字符串:

改变:

cmd 'foo "bar 'baz' quux"'
#             ^   ^

至:

cmd 'foo "bar '"'"'baz'"'"' quux"'
#             ^^^^^   ^^^^^

您可以使用其他转义样式,但这一种可以在所有 posix shell 中移植。

于 2014-01-30T17:02:19.093 回答