即使条件为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除外)。