Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使条件为false,也会执行True case语句-MySQL_Mysql_Sql_Database - Fatal编程技术网

即使条件为false,也会执行True case语句-MySQL

即使条件为false,也会执行True case语句-MySQL,mysql,sql,database,Mysql,Sql,Database,仅当某列存在时,我才需要选择该列 我以这种方式尝试了这项检查: set @esisteIlCampo = ( SELECT COUNT(*) FROM ( SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'ventodelnord' AND TABLE_NA

仅当某列存在时,我才需要选择该列

我以这种方式尝试了这项检查:

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;如果不存在,则为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`;
但即使
@esistielcampo
为0,因此
@esistielcampo=1
的计算结果为false,也会执行
选择impiegati.Email from impiegati limit 1
查询


这是怎么可能的?

使用选择进入开始

SELECT COUNT(*) INTO @esisteIlCampo
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'ventodelnord' 
    AND TABLE_NAME = 'impiegati' 
    AND COLUMN_NAME = 'Email';
然后你可以用

SELECT @esisteIlCampo; 
看看结果

然后可以在第二个查询中使用它。
当然要确保你得到了结果。

你可以使用以下技巧:

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
——并且由于correlation子句,它应该来自同一行。

您能提供示例数据和所需结果吗?SQL查询有一组固定的列。不能根据列是否存在而改变它(使用
*
或动态SQL除外)。