我需要能够检查列是否存在,如果存在,那么我想从中进行SELECT。
我正在尝试很多不同的变化,但我甚至不确定这是否可行。
这是我最近的尝试:
SELECT
IF (EXISTS (SELECT `Period` AS `Period` FROM myview), `PERIOD`,
IF (EXISTS (SELECT `Country` AS `COUNTRY` FROM myview),`COUNTRY` FROM myview ;
有什么想法吗?
修改
我在这里看到了另一个问题:MySQL, Check if a column exists in a table with SQL
但我仍然对if语句感到困惑。我可以使用上面问题中的答案检查列是否存在。但我的问题是 - 如果发现结果为真,如何从该列执行select语句。
编辑2
下面的答案表明我应该使用BEGIN和END语句,这是有道理的。但是,我的查询在第一行抱怨。它说'意外的IF' - 任何人都可以确认这是否是MYSQL的正确语法?
if( exists (SELECT *
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'view_name'
AND COLUMN_NAME = 'column_name') )
begin
SELECT `column_name` FROM `view_name`
end
提前致谢。
答案 0 :(得分:5)
此查询将为您提供列是否存在。
SELECT *
FROM information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name'
AND COLUMN_NAME = 'column_name'
如果要检查是否存在某些列,请执行select语句,首先需要检查列是否存在。然后执行选择:
if (exists (SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 'myview' AND COLUMN_NAME = 'Period') and exists (SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 'myview' AND COLUMN_NAME = 'Country'))
begin
select `Period`, `Country` from myview
end
如果IF条件为真,那么您将执行BEGIN和END内的任何内容。
答案 1 :(得分:0)
我遇到的情况与用户上传的工作表创建的产品表相同。有时,工作表没有名为"过时"的列,所以我必须从工作表中导入所有产品,而不是过时的。
我没有根据提出的原始问题修改我的查询,但这是我的解决方案:
SELECT
t2.model,
(
SELECT
COUNT(*) AS _count
FROM db.table t1
WHERE
`obsolete`=1
AND t1.model=t2.model
) AS `obsolete`
FROM (
SELECT
0 AS `obsolete`,
t3.model
FROM db.table t3
) t2
此查询中有两个最重要的部分:
obsolete
作为假人来愚弄MySql,即使在选择COUNT(*)时列不存在也会使用。