Операторы True Case выполняются, даже если условие ложно - MySQL - PullRequest
0 голосов
/ 14 февраля 2020

Мне нужно выбрать столбец, только если этот столбец существует.

Я пробовал эту проверку следующим образом:

set @esisteIlCampo = 
    (
        SELECT COUNT(*) 
        FROM 
        ( 
            SELECT * 
            FROM information_schema.COLUMNS 
            WHERE TABLE_SCHEMA = 'ventodelnord' 
            AND TABLE_NAME = 'impiegati' 
            AND COLUMN_NAME = 'Email'
        ) AS t 
    ) > 0

Если дает 1, если столбец Email существует, и 0 если нет.

Тогда у меня есть запрос, чтобы использовать его:

SELECT
    `i`.`IDImpiegato` AS `ID`,
    `i`.`TelDomicilio` AS `Numero Di Telefono`,
    CONCAT(`i`.`Nome`, ' ', `i`.`Cognome`) AS `Nome Completo`,
    (
        CASE WHEN
        @esisteIlCampo = 1 
        THEN
        (
            SELECT impiegati.Email from impiegati limit 1 
        ) 
        ELSE
        (
           SELECT "Campo Mancante"
        )
        END
    ) as "Email",
    'Impiegati' AS `Tabella di provenienza`
FROM
    `impiegati` `i`;

Но даже если @esisteIlCampo равен 0, поэтому @esisteIlCampo = 1 оценивается как ложное, SELECT impiegati.Email from impiegati limit 1 запрос выполнен.

Как это возможно?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы можете использовать этот трюк:

select i.*,
       (select email  -- NO qualified name on purpose!!!
        from impiegati i2
        where i2.IDImpiegato = i.IDImpiegato
      ) as email
from impiegati i cross join
     (select 'Camp Mancante' as email) x;

Этот трюк используется в коррелированном подзапросе. Если столбец не существует в impiegati, то email относится к x.email. Если столбец существует, он ссылается на i2.impiegati - и из-за предложения о корреляции он должен быть из той же строки.

0 голосов
/ 14 февраля 2020

Начните с использования SELECT INTO

SELECT COUNT(*) INTO @esisteIlCampo
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'ventodelnord' 
    AND TABLE_NAME = 'impiegati' 
    AND COLUMN_NAME = 'Email';

Затем вы можете использовать

SELECT @esisteIlCampo; 

, чтобы увидеть результат.

Затем вы можете использовать его во втором запросе , Конечно, убедитесь, что вы получите результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...