案情回顾:

就是在 concat 函数中,使用一个汇聚函数的子查询的结果作为了一个参数,SQL 就报错了,不能正常运行。

  1. select MIN(t.birthday) as birthday FROM test_tab t;
  2. -- 结果:
  3. -- 2021-01-21 09:03:51
  4. select CONCAT('最小年龄人的生日时间:', MIN(t.birthday)) as birthday FROM test_tab t;
  5. -- 结果:
  6. -- 最小年龄人的生日时间:2021-01-21 09:03:51
  7. select CONCAT('最小年龄人的生日时间:', (select MIN(t.birthday) FROM test_tab t) as birthday from dual;
  8. -- 结果:
  9. -- 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 的子列。

  1. -- 语句正确,exists 子句
  2. SELECT
  3. xjl.id,
  4. xjl.executor_address,
  5. xjl.alarm_status
  6. FROM
  7. xxl_job_log xjl
  8. WHERE
  9. EXISTS (
  10. SELECT
  11. xjg.id
  12. FROM
  13. xxl_job_group xjg
  14. WHERE
  15. xjg.id = xjl.job_group
  16. );
  17. -- 语句正确,in 子句
  18. SELECT
  19. xjl.id,
  20. xjl.executor_address,
  21. xjl.alarm_status
  22. FROM
  23. xxl_job_log xjl
  24. WHERE
  25. xjl.job_group IN (
  26. SELECT
  27. xjg.id
  28. FROM
  29. xxl_job_group xjg
  30. );
  31. -- 语句错误,like 中无法使用
  32. SELECT
  33. xjl.id,
  34. xjl.executor_address,
  35. xjl.alarm_status
  36. FROM
  37. xxl_job_log xjl
  38. WHERE
  39. xjl.executor_address LIKE (
  40. SELECT
  41. CONCAT(xjg.id, '%')
  42. FROM
  43. xxl_job_group xjg
  44. ) AS a
  45. );
  46. -- 语句错误,like 中无法使用
  47. SELECT
  48. xjl.id,
  49. xjl.executor_address,
  50. xjl.alarm_status
  51. FROM
  52. xxl_job_log xjl
  53. WHERE
  54. (
  55. SELECT
  56. xjl.executor_address LIKE CONCAT(xjg.id, '%')
  57. FROM
  58. xxl_job_group xjg
  59. ) AS a
  60. );
  61. -- 语句正确,将相应的条件添加到 select 列上,然后将该列作为 where 子句的过滤条件
  62. SELECT
  63. *
  64. FROM
  65. (
  66. SELECT
  67. xjl.id,
  68. xjl.executor_address,
  69. xjl.alarm_status,
  70. xjl.executor_address LIKE CONCAT(xjg.id, '%') AS like_
  71. FROM
  72. xxl_job_log xjl,
  73. xxl_job_group xjg
  74. ) a
  75. WHERE
  76. like_;
  77. -- 子查询结果作为一个 from table 集合
  78. SELECT
  79. date
  80. FROM
  81. (SELECT now() AS date FROM DUAL) a;
  82. -- 结果:
  83. -- 2021-01-30 09:12:46
  84. -- 函数中使用函数
  85. SELECT
  86. date
  87. FROM
  88. (
  89. SELECT
  90. min(now()) AS date
  91. FROM
  92. DUAL
  93. ) a;
  94. -- 结果:
  95. -- 2021-01-30 09:12:46

小结:

函数中不可存在 select 子句,此时可以将函数挪移到 select 子句中。