根据条件将两个MySql查询组合成一个查询

根据条件将两个MySql查询组合成一个查询,mysql,join,select,inner-join,Mysql,Join,Select,Inner Join,我使用的是5.7.20-enterprise-commercial,有一个MySql查询,如下所示: SELECT name FROM jobTable where jobId IN (SELECT dataId from logTable WHERE eValue ='1098hbfce'); 如果上述查询返回空值,则我希望运行以下查询: SELECT name FROM jobTable where procId IN ( SELECT dataId from logTable WHERE

我使用的是
5.7.20-enterprise-commercial
,有一个MySql查询,如下所示:

SELECT name FROM jobTable where jobId IN (SELECT dataId from logTable
WHERE eValue ='1098hbfce');
如果上述查询返回空值,则我希望运行以下查询:

SELECT name FROM jobTable where procId IN (
SELECT dataId from logTable WHERE eValue ='1098hbfce');
第一个查询和第二个查询之间的唯一区别是在第一个查询中使用了
jobId
。 并且,在第二个查询中使用了
procId

另外,如果第一个查询返回
non-null
值,我不想运行第二个查询

我正在使用以下方法,但它似乎无法正常工作

IF (SELECT name FROM jobTable where jobId IN (SELECT dataId from logTable
   WHERE eValue ='1098hbfce')) IS NOT NULL 
   EXECUTE (SELECT name FROM jobTable where procId IN (
   SELECT dataId from logTable WHERE eValue ='1098hbfce'));
要求是在SQL查询本身中执行,而不创建存储过程。
使用
CASE
表达式,
jobTable
logTable
之间没有关系:

SELECT name 
FROM jobTable 
where (CASE 
       WHEN jobId IN (SELECT dataId from logTable WHERE eValue ='1098hbfce')
       THEN 1
       WHEN procId IN (SELECT dataId from logTable WHERE eValue ='1098hbfce') 
       THEN 1 
      END) = 1 ;

使用
CASE
表达式:

SELECT name 
FROM jobTable 
where (CASE 
       WHEN jobId IN (SELECT dataId from logTable WHERE eValue ='1098hbfce')
       THEN 1
       WHEN procId IN (SELECT dataId from logTable WHERE eValue ='1098hbfce') 
       THEN 1 
      END) = 1 ;
结合

drop table if exists t,log_table;
create table t(name varchar(10),jobid int,procid int);
create table log_table(dataid int,evalue varchar(10));

insert into t values ('aaa',null,null),('bbb',null,1),('ccc',1,null);
insert into log_table values(1,'1098hbfce');

select *,
        coalesce(jobid,procid),
        coalesce(procid,jobid)
        
from t
join log_table lt on 
        dataid = coalesce(jobid,procid) or dataid = coalesce(procid,jobid)  ;

+------+-------+--------+--------+-----------+------------------------+------------------------+
| name | jobid | procid | dataid | evalue    | coalesce(jobid,procid) | coalesce(procid,jobid) |
+------+-------+--------+--------+-----------+------------------------+------------------------+
| bbb  |  NULL |      1 |      1 | 1098hbfce |                      1 |                      1 |
| ccc  |     1 |   NULL |      1 | 1098hbfce |                      1 |                      1 |
+------+-------+--------+--------+-----------+------------------------+------------------------+
2 rows in set (0.001 sec)

        
结合

drop table if exists t,log_table;
create table t(name varchar(10),jobid int,procid int);
create table log_table(dataid int,evalue varchar(10));

insert into t values ('aaa',null,null),('bbb',null,1),('ccc',1,null);
insert into log_table values(1,'1098hbfce');

select *,
        coalesce(jobid,procid),
        coalesce(procid,jobid)
        
from t
join log_table lt on 
        dataid = coalesce(jobid,procid) or dataid = coalesce(procid,jobid)  ;

+------+-------+--------+--------+-----------+------------------------+------------------------+
| name | jobid | procid | dataid | evalue    | coalesce(jobid,procid) | coalesce(procid,jobid) |
+------+-------+--------+--------+-----------+------------------------+------------------------+
| bbb  |  NULL |      1 |      1 | 1098hbfce |                      1 |                      1 |
| ccc  |     1 |   NULL |      1 | 1098hbfce |                      1 |                      1 |
+------+-------+--------+--------+-----------+------------------------+------------------------+
2 rows in set (0.001 sec)

        

看起来很熟悉你昨天问这个了吗?看起来很熟悉你昨天问这个了吗?