Sql 不在shell命令内工作时的情况

Sql 不在shell命令内工作时的情况,sql,shell,postgresql,psql,greenplum,Sql,Shell,Postgresql,Psql,Greenplum,当使用CASE-WHEN语句从shell中启动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_t

当使用CASE-WHEN语句从shell中启动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”字符串,我们无法更改外部表设计)

我的目标是使用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命令运行时,它不起作用,就像仍然在
col2
列中放置“NULL”字符串一样。

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

postgres=# select $$AHOJ$$;
 ?column? 
----------
 AHOJ
(1 row)
这些文字分隔符可以使用from shel

[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)

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

更改:

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


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

如何转义
'NULL'
-->
\'NULL\'
为什么不将其设置为存储过程并在后台运行?将其设置为SP不是一个选项,因为它是一个自动化系统,所有命令都是从shell脚本生成的,并且如果CASE在后台不工作,那么将其设置为SPSQL语句,则它将无法在SP定义(从shell脚本运行)中工作,或者如fedorqui所述转义您的引号,或者将DB引号更改为美元,“col2=$$NULL$$”(您的整个命令都在单引号中,因此美元不需要从shell转义)。与此无关,但我还是一个“nullif(col2,$$NULL$$)”而不是case语句简洁的粉丝。这很有效,但在一个包含所有转义前斜杠的大型shell脚本中,语法有点难以管理。
cmd 'foo "bar '"'"'baz'"'"' quux"'
#             ^^^^^   ^^^^^