我在数据库A、B和C中有3个表,它们共享相同的列"NAME". B具有属性"TITLE",而C具有属性"AGE".

我希望写一个SQL查询,我将不得不 Select 基于查询输入A的所有内容,无论是B.title,C.age或所有它们.

到目前为止,我所try 的是,

SELECT * FROM A
LEFT JOIN B ON A.name = B.name
LEFT JOIN C ON A.name = C.name 
WHERE B.title = COALESCE($1, B.title)
AND C.age = COALESCE($2, C.age)

$1和$2来自外部程序.例如,$1="Jones"和$2=12.

我从上面的查询中得到的结果为空.也左联看起来很贵.有没有更快的方法来实现这一点,而不是加入谈判桌.

如果$1为NULL,则查询将不会有来自B表的任何连接.我想从A中取回名称.如果$2为空,则查询将不会联接C表,依此类推.如果两者都为空,它将返回A拥有的任何内容.

推荐答案

将第WHERE条的条件移至其各自的第ON条:

SELECT * 
FROM A
LEFT JOIN B ON B.name = A.name AND B.title = $1
LEFT JOIN C ON C.name = A.name AND C.age = $2;

如果$1null,则条件:

B.title = $1

将返回null,并且满足以下条件:

A.name = B.name AND B.title = $1 

will also be null, which will lead to a no-match for all the rows of B.

同样的道理也适用于$2人.

Postgresql相关问答推荐

此PostgreSQL汇总分组不适用于窗口表达式

在Postgres游标中从一行变量中减go 另一行变量

为什么我的唯一索引在 Postgresql 中不起作用?

在特定距离内创建点的唯一索引

使用 GDB 调试器调试 AGE 代码的过程

postgresql中多个左连接的空结果

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

gorm 创建并返回值 many2many

Postgres 14 反斜杠 Z 没有给出正确的输出

Postgres 唯一 JSON 数组聚合值

postgresql 更新错误ERROR: invalid input syntax for type boolean:

在 to_tsquery 中转义特殊字符

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

将 Postgres 与 Grails 一起使用

Postgres COPY FROM csv file-No such file or directory

为什么 sqlalchemy 的默认列值不起作用

在这个 Dockerfile 中创建的 Postgres 用户名/密码在哪里?

Postgres 默认按 id 排序 - worldship

如何禁用 postgresql缓存优化?

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)