2015-10-02 4 views
0

Так что я хочу запускать разные запросы в зависимости от того, является ли одно поле нулевым. Вот что у меня естьЗапустить конкретный запрос, если поле равно

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

Я только начинаю с более сложных запросов и понятия не имею, почему это неправильно.

+0

Вы не можете сделать подзапрос в оператор select, который возвращает больше одного поля и не возвращает более одной строки. Ошибка, которую вы видите, заключается в том, что вы выбираете поле 'vehicle_uid', где нет, у вас нет предложения' from', чтобы база данных знала, откуда она взялась. –

+0

Я попытался добавить предложение 'from' в самом конце, которое дало мне' # 1241 - Операнд должен содержать 1 столбец 'error – codemaker

+0

См. Мой ответ. Что-нибудь еще, просто спросите –

ответ

-1

Вы должны использовать UNION с двумя разными операторами 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 
) 
0

Вам не хватает статьи FROM из вашего внешнего запроса.

0

Вы не можете сделать подзапрос в select заявление, которое возвращает более чем одно поле и ни возвращающегося более одной строки. Ошибка, которую вы видите, заключается в том, что вы выбираете поле 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 

Несмотря на то, что это лучший вариант для вашей проблемы вам придется настроить оба запроса. Поскольку я не знаю вашу структуру, это лучшее, с чем я могу помочь.

Смежные вопросы