根据条件将两个 MySql 查询合并为一个查询
Combining two MySql queries into a single query based upon a condition
我正在使用 5.7.20-enterprise-commercial
并有一个 MySql 查询,如下所示:
SELECT name FROM jobTable where jobId IN (SELECT dataId from logTable
WHERE eValue ='1098hbfce');
如果上面的查询 returns 一个空值那么我想 运行 下面的查询:
SELECT name FROM jobTable where procId IN (
SELECT dataId from logTable WHERE eValue ='1098hbfce');
第一个查询和第二个查询之间的唯一区别是在第一个查询中使用 jobId
。
并且,在第二个查询中使用 procId
此外,如果第一个查询returns 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 查询本身中执行,而不创建存储过程。
jobTable
和logTable
没有关系
使用 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)
我正在使用 5.7.20-enterprise-commercial
并有一个 MySql 查询,如下所示:
SELECT name FROM jobTable where jobId IN (SELECT dataId from logTable
WHERE eValue ='1098hbfce');
如果上面的查询 returns 一个空值那么我想 运行 下面的查询:
SELECT name FROM jobTable where procId IN (
SELECT dataId from logTable WHERE eValue ='1098hbfce');
第一个查询和第二个查询之间的唯一区别是在第一个查询中使用 jobId
。
并且,在第二个查询中使用 procId
此外,如果第一个查询returns 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 查询本身中执行,而不创建存储过程。
jobTable
和logTable
使用 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)