使用动态 where 语句从表中选择一个值

Posted

技术标签:

【中文标题】使用动态 where 语句从表中选择一个值【英文标题】:Selecting a value from a table with a dynamically where statement 【发布时间】:2020-10-24 23:58:24 【问题描述】:

我有以下4张桌子

表 a: ID, 姓名, 出价, c_id

表 b: ID, 姓名, d_id

表 c: ID, 姓名, d_id

表 d: ID, 名字

然后我有我的查询,就我能写的而言:

SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id

我需要添加一个带有动态 ON 的 LEFT JOIN 寻址表“d”。 它应该是 左连接 d ON b.d_id = d.id (如果 a.b_id != 0) 要么 左连接 d ON c.d_id = d.id(如果 a.b_id == 0)

我试着写

SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id
if((if a.b_id != 0,LEFT JOIN d ON b.d_id = d.id, LEFT JOIN d ON c.d_id = d.id )

但这会引发错误

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'IF(a.b_id != 0, LEFT JOIN d ON b.d_id = d.id, LEFT JOIN d ON c.d_id = d.id 附近使用的正确语法)' 在第 6 行"

【问题讨论】:

你也可以加入两次,在select中使用case表达式选择正确的表 【参考方案1】:

好吧,你可以使用:

FROM a LEFT JOIN
     b
     ON a.b_id = b.id LEFT JOIN
     c
     ON a.c_id = c.id LEFT JOIN
     d
     ON (a.b_id <> 0 AND b.d_id = d.id) OR
        (a.b_id = 0 AND c.d_id = d.id)

这不考虑NULL 值。如果需要:

     ON (a.b_id <> 0 AND b.d_id = d.id) OR
        (COALESCE(a.b_id, 0) = 0 AND c.d_id = d.id)

在 SQL 中,CASE 是一个返回值的表达式。它不是代码被替换的宏。

此外,这也回答了您在此处提出的问题。但是,这可能不是完成您想要的最高效的方式。如果您还需要性能方面的帮助,请提出 问题。提供样本数据、期望的结果以及您想要实现的逻辑的解释。 DB/SQL Fiddle 也有帮助。

【讨论】:

【参考方案2】:

你可以试试:

SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id
LEFT JOIN
    ON (a.b_id <> 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id);

【讨论】:

【参考方案3】:

您不能像这样动态添加连接子句,但您可以使用一些逻辑运算符来模拟连接条件内的功能:

SELECT    a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM      a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id
LEFT JOIN d ON (a.b_id != 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id)

【讨论】:

以上是关于使用动态 where 语句从表中选择一个值的主要内容,如果未能解决你的问题,请参考以下文章

在 where 子句中使用子查询从表中选择第二大日期

SQL-W3School:SQL WHERE 语句

从数据表中检索信息

如何使用 join 和 where 子句从表中删除? [复制]

where 子句中的动态值

使用 JDBC 从表中选择前 N 行的通用方法