使用动态 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 语句从表中选择一个值的主要内容,如果未能解决你的问题,请参考以下文章