案情回顾:
就是在 concat 函数中,使用一个汇聚函数的子查询的结果作为了一个参数,SQL 就报错了,不能正常运行。
select MIN(t.birthday) as birthday FROM test_tab t;-- 结果:-- 2021-01-21 09:03:51select CONCAT('最小年龄人的生日时间:', MIN(t.birthday)) as birthday FROM test_tab t;-- 结果:-- 最小年龄人的生日时间:2021-01-21 09:03:51select CONCAT('最小年龄人的生日时间:', (select MIN(t.birthday) FROM test_tab t) as birthday from dual;-- 结果:-- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from dual' at line 2
小思:
没有关注过,函数中是否能够使用一个子查询的结果作为参数。
子查询结果的使用,常常是在 in 、exists 等子句,或者聚合函数的结果直接作为 select 的子列。
-- 语句正确,exists 子句SELECTxjl.id,xjl.executor_address,xjl.alarm_statusFROMxxl_job_log xjlWHEREEXISTS (SELECTxjg.idFROMxxl_job_group xjgWHERExjg.id = xjl.job_group);-- 语句正确,in 子句SELECTxjl.id,xjl.executor_address,xjl.alarm_statusFROMxxl_job_log xjlWHERExjl.job_group IN (SELECTxjg.idFROMxxl_job_group xjg);-- 语句错误,like 中无法使用SELECTxjl.id,xjl.executor_address,xjl.alarm_statusFROMxxl_job_log xjlWHERExjl.executor_address LIKE (SELECTCONCAT(xjg.id, '%')FROMxxl_job_group xjg) AS a);-- 语句错误,like 中无法使用SELECTxjl.id,xjl.executor_address,xjl.alarm_statusFROMxxl_job_log xjlWHERE(SELECTxjl.executor_address LIKE CONCAT(xjg.id, '%')FROMxxl_job_group xjg) AS a);-- 语句正确,将相应的条件添加到 select 列上,然后将该列作为 where 子句的过滤条件SELECT*FROM(SELECTxjl.id,xjl.executor_address,xjl.alarm_status,xjl.executor_address LIKE CONCAT(xjg.id, '%') AS like_FROMxxl_job_log xjl,xxl_job_group xjg) aWHERElike_;-- 子查询结果作为一个 from 的 table 集合SELECTdateFROM(SELECT now() AS date FROM DUAL) a;-- 结果:-- 2021-01-30 09:12:46-- 函数中使用函数SELECTdateFROM(SELECTmin(now()) AS dateFROMDUAL) a;-- 结果:-- 2021-01-30 09:12:46
小结:
函数中不可存在 select 子句,此时可以将函数挪移到 select 子句中。
