运行 字段为空时的特定查询

Run particular query if field is null

所以我想 运行 根据一个字段是否为空进行不同的查询。这是我的

SELECT 
CASE
WHEN vehicle_uid IS NULL THEN (SELECT lic_num, vehicle_make, vehicle_model, zone.name
                    FROM notice
                    INNER JOIN zone on notice.zone_uid = zone.uid

                    WHERE lic_num IN (
                        SELECT lic_num 
                        FROM notice
                        GROUP BY lic_num 
                        HAVING count(*) > 1
                    ))

ELSE (SELECT lic_num, vehicle_uid, model.model, make.make, zone.name
    FROM notice
    INNER JOIN vehicle_model AS model ON notice.vehicle_uid = model.uid
    INNER JOIN vehicle_make AS make ON model.vehicle_make_uid = make.uid
    INNER JOIN zone on notice.zone_uid = zone.uid

    WHERE lic_num IN (
        SELECT lic_num 
        FROM notice
        GROUP BY lic_num 
        HAVING count(*) > 1
    ))
END 

我得到的错误是 #1054 - Unknown column 'vehicle_uid' in 'field list' 当我将 WHEN vehicle_uid IS NULL 更改为 WHEN notice.vehicle_uid IS NULL 时,错误显示:#1109 - Unknown table 'notice' in field list

我也试过了
SELECT CASE vehicle_uid WHEN IS NULL THEN ... 并出现以下错误:#1064 - 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 'IS NULL THEN (SELECT lic_num, vehicle_make, vehicle_model, zone.name FROM n' at line 3

我刚开始使用更复杂的查询,不知道为什么会这样。

您的外部查询中缺少 FROM 子句。

您应该将 UNION 与 return 相同列的两个不同 SELECT 语句一起使用。

(SELECT lic_num, vehicle_make uid_or_make, vehicle_model, '', zone.name
    FROM notice
    INNER JOIN zone on notice.zone_uid = zone.uid
    WHERE lic_num IN (SELECT lic_num FROM notice GROUP BY lic_num  HAVING count(*) > 1) AND vehicle_uid IS NULL
)
UNION ALL
(SELECT lic_num, vehicle_uid uid_or_make, model.model vehicle_model, make.make, zone.name
    FROM notice
    INNER JOIN vehicle_model AS model ON notice.vehicle_uid = model.uid
    INNER JOIN vehicle_make AS make ON model.vehicle_make_uid = make.uid
    INNER JOIN zone on notice.zone_uid = zone.uid
    WHERE lic_num IN (SELECT lic_num FROM notice GROUP BY lic_num HAVING count(*) > 1) AND vehicle_uid IS NOT NULL
)

您不能对 select 语句执行子查询 returns 多个字段,也不能返回多于一行。您看到的错误是因为您从无处选择了一个字段 vehicle_uid,您没有 from 子句让数据库知道它来自哪里。

解决您的问题的最佳方法是根据特定条件执行 UNION,但只有当两个查询具有相同的列集时它才会起作用,因此:

SELECT lic_num, 
       vehicle_make,
       '' SUBSTITUTE_FORVEHICLEUID,
       vehicle_model, 
       '' SUBSTITUTE_FOR_MAKE,
       zone.name
  FROM notice
        INNER JOIN zone ON notice.zone_uid = zone.uid
 WHERE lic_num IN (
           SELECT lic_num 
             FROM notice
            GROUP BY lic_num 
           HAVING count(*) > 1
         )
   AND vehicle_uid is null
UNION
SELECT lic_num,  
       '' SUBSTITUTE_FOR_VEHICLEMAKE, 
       vehicle_uid, 
       model.model, 
       make.make, 
       zone.name
  FROM notice
      INNER JOIN vehicle_model AS model ON notice.vehicle_uid = model.uid
      INNER JOIN vehicle_make AS make ON model.vehicle_make_uid = make.uid
      INNER JOIN zone on notice.zone_uid = zone.uid
 WHERE lic_num IN (
        SELECT lic_num 
        FROM notice
        GROUP BY lic_num 
        HAVING count(*) > 1
      )
   AND vehicle_uid IS NOT NULL

即使这是解决您的问题的最佳选择,您也必须调整这两个查询。因为我不知道你的结构是我能提供的最好的。