postgresql - 存在时的情况 - 列 (SQL)

标签 postgresql psql

如果特定列 (pv_an4) 不存在,我将尝试使用“0”填充 XML 文件的字段,如果存在,则使用该列的值填充。

到目前为止,这是我的代码:

XMLELEMENT( Name "Telephone",
case
when not exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then ''
when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then pv_an4
end ),

当我执行这个时,我得到了这个错误:

FEHLER: Column »pv_an4« does not exist ZEILE 25: ...E_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then pv_an4

但这对我来说毫无意义,因为例如使用这段代码它会起作用:

....

when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then 'pv_an4 exists'
end ),

....

我花了一整天的时间试图解决这个问题,请问有人能给我指明正确的方向吗?

/edit:下面是完整的查询:

    SELECT
XMLFOREST( xmlpb.entry as "DivinusIPPhoneDirectory" )
FROM (
SELECT
XMLCONCAT (
XMLELEMENT ( NAME "Title", 'Phonelist' ),
XMLELEMENT ( NAME "Prompt", 'Prompt' ),
XMLAGG (
XMLELEMENT (
NAME "DirectoryEntry",
XMLELEMENT( Name "Name",
case
when (pb.company = '') IS FALSE AND pb.lastname != '' and pb.firstname != '' then pb.company || ' - ' || pb.lastname || ', ' || pb.firstname
when (pb.company = '') IS FALSE AND pb.lastname != '' and pb.firstname = '' then pb.company || ' - ' || pb.lastname
when (pb.company = '') IS FALSE AND pb.lastname = '' and pb.firstname = '' then pb.company
when (pb.company = '') IS FALSE AND pb.lastname = '' and pb.firstname != '' then pb.company || ' - ' || pb.firstname
when (pb.company = '') IS NOT FALSE AND pb.lastname != '' and pb.firstname != '' then pb.lastname || ', ' || pb.firstname
when (pb.company = '') IS NOT FALSE AND  pb.lastname != '' and pb.firstname = '' then pb.lastname
end ),
XMLELEMENT( Name "Telephone", pb.pv_an3 ),
XMLELEMENT( Name "Telephone",
case
when not exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'phonebook' AND COLUMN_NAME = 'pv_an4') then ''
else pb.pv_an4
end ),
XMLELEMENT( Name "Telephone", pb.phonenumber ),
XMLELEMENT( Name "Telephone", pb.pv_an1 ),
XMLELEMENT( Name "Telephone", pb.pv_an2 )
)
)
) as entry
FROM
phonebook pb
WHERE fkidtenant = 1

最佳答案

整个 sql 语句在运行之前被解析和编译,因此 postgresql 会提示缺少字段。没有捷径。

如果要处理此类场景,则需要使用动态生成的sql(检查该列是否存在并创建适当的sql语句)。虽然我真的无法想象为什么你不应该知道某个列是否存在于表中。

关于postgresql - 存在时的情况 - 列 (SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192586/

相关文章:

postgresql - 创建 Wildfly 10 数据源时出现问题

performance - J2EE - PostgreSQL - JDBC - 慢速查询

postgresql - Yii2多库查询

postgresql - psql: FATAL: 数据库 "<user>"不存在

postgresql - 将行插入临时表

sql - psql 中输入的 SQL 命令属于 SQL(Postgresql 的 SQL 方言)还是 PL/PgSQL?

postgresql - 尝试在 Postgres 中导出 CSV 时权限被拒绝

postgresql - 我应该如何修复此 PostgreSQL 安装?

r - 将 R 代码推送到 postgresql 数据库中的 PL/R 代码

sql - 将一列分成两列,然后将新列与其他表连接