提问者:小点点

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


我有以下4个表格

表A:id,name,b_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

我需要添加一个左联接地址表“d”,它带有一个ON,这是动态的。 应在B.D_ID=d.ID(如果A.B_ID!=0)上左联接d,或在C.D_ID=d.ID(如果A.B_ID==0)上左联接d

我试着写

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服务器版本相对应的手册,以便在第6行的'if(a.b_id!=0,LEFT JOIN d ON b.d_id=d.id,LEFT JOIN d ON 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)

匿名用户

您可以尝试:

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

匿名用户

你可以使用:

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小提琴也有帮助。