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

bwitn5fc  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(209)

我有以下4张table
表a:id、名称、b\U id、c\U id
表b:id、名称、d\U id
表c:id、名称、d\U 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\u id=d.id(如果a.b\u id!=0)或在c.d\u id=d.id上左连接d(如果a.b\u 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\u id!=0,b.d上的左连接d(id=d.id),c.d上的左连接d(id=d.id),在第6行

u91tlkcl

u91tlkcl1#

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

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

brgchamk2#

您可以尝试:

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

flmtquvp3#

你可以用:

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/sqlfiddle也有帮助。

相关问题