【问题标题】:MySQL if statement returns empty or null, then set to 0MySQL if 语句返回空或 null,然后设置为 0
【发布时间】:2022-01-06 15:01:28
【问题描述】:

使用 MySQL (MariaDB)

我正在查看子查询是否返回 null,如果是,我希望它为 0。我无法让它工作。 此语句中的值应返回 NULL(它们在我的数据库中不存在)。我做错了什么?

SELECT 
   (COALESCE(SELECT z.ID FROM bus_values z WHERE (z.BUS_NUM=35 AND z.WORKER_ID=2922882), 0)) AS BUS_ID, 
   XVAL, 
   YVAL, 
   ZVAL, 
   DATE_ENTERED 
FROM data_points WHERE (WORKER_ID=2922882);

MySQL 告诉我(COALESCE(SELECT ... 行有语法错误

我也尝试过使用 IFNULL()

【问题讨论】:

    标签: mysql null mariadb subquery


    【解决方案1】:

    您可以通过 LEFT 加入:

    SELECT COALESCE(z.ID, 0) AS BUS_ID, 
           p.XVAL, 
           p.YVAL, 
           p.ZVAL, 
           p.DATE_ENTERED 
    FROM data_points p LEFT JOIN bus_values z
    ON z.WORKER_ID = p.WORKER_ID AND z.BUS_NUM = 35
    WHERE p.WORKER_ID = 2922882;
    

    【讨论】:

      【解决方案2】:

      根据您的查询,您可以尝试使用CROSS JOIN

      您不能在COALESCE 函数中使用子查询,因为结果集中可能有多行。

      SELECT 
         COALESCE(z.ID, 0) AS BUS_ID, 
         p.XVAL, 
         p.YVAL, 
         p.ZVAL, 
         p.DATE_ENTERED 
      FROM data_points p
      CROSS JOIN bus_values z
      WHERE (p.WORKER_ID=2922882) AND z.BUS_NUM=35 AND z.WORKER_ID=2922882;
      

      否则,您可以尝试在子查询端使用limit 1

      SELECT 
         COALESCE((SELECT z.ID FROM bus_values z WHERE z.BUS_NUM=35 AND z.WORKER_ID=2922882 limit 1), 0) AS BUS_ID, 
         XVAL, 
         YVAL, 
         ZVAL, 
         DATE_ENTERED 
      FROM data_points WHERE (WORKER_ID=2922882);
      

      【讨论】:

      • 有趣...我使用 LEFT RIGHT 和 INNER 连接,但从未使用过 CROSS JOIN。
      【解决方案3】:

      正如在其他地方指出的那样,在这样的表达式中使用子查询仅在它最多返回一行时才有效(如有必要,您可以使用 LIMIT 1 强制执行)。

      您的语法错误是由于您需要两组括号而只有一组。表达式中的子查询必须在括号中,并且 coalesce 调用需要括号。所以简单地改变:

      SELECT 
         (COALESCE(SELECT z.ID FROM bus_values z WHERE (z.BUS_NUM=35 AND z.WORKER_ID=2922882), 0)) AS BUS_ID, 
      

      到:

      SELECT 
         (COALESCE((SELECT z.ID FROM bus_values z WHERE (z.BUS_NUM=35 AND z.WORKER_ID=2922882)), 0)) AS BUS_ID, 
      

      解决了您的问题,但如果 bus_num 和 worker_id 无法识别唯一行,您应该选择 MAX(z.ID) 或在子查询中添加 order by 和 limit 1 以获取您想要找到的任何 id。

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 2013-01-02
        • 1970-01-01
        • 2018-01-08
        • 2018-05-07
        • 2022-10-13
        • 1970-01-01
        • 2015-07-26
        • 2013-11-26
        相关资源
        最近更新 更多