【问题标题】:Mysql How to only select from a column if the column exists如果列存在,Mysql如何仅从列中选择
【发布时间】:2014-08-03 08:35:45
【问题描述】:

我需要能够检查一列是否存在,如果存在,那么我想从中选择。

我正在尝试很多不同的变化,但我什至不确定这是否可行。

这是我最近的尝试:

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 语句,这是有道理的。但是,我的查询在第一行抱怨。它说'unexpected 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

提前致谢。

【问题讨论】:

  • 您只能使用动态 SQL 执行此操作,即使用 prepare 语句。
  • 这种问题有时表明设计不佳
  • 您是如何陷入不知道某列是否存在的情况的?
  • 出现问题是因为我需要从多个不同来源提取标准化报告,而没有共同的架构或关系。我可以手动编写每个查询的代码,但是要从中提取太多视图,这变得非常困难。

标签: mysql select if-statement exists


【解决方案1】:

我遇到了同样的情况,我有一些由用户上传的工作表创建的产品表。有时,工作表没有名为“过时”的列,所以我必须从工作表中导入所有产品,而不是过时的产品。

我没有根据最初提出的问题修改我的查询,但这是我的解决方案:

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

这个查询中有两个最重要的部分:

  1. 我们选择 0 AS obsolete 作为 dummy 来欺骗 MySql,即使在选择 COUNT(*) 时列不存在时也会使用它。
  2. 我们将表命名为 t1 和 t2 以匹配列模型 t1.model=t2.model。

【讨论】:

    【解决方案2】:

    这个查询会告诉你一列是否存在。

    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 内的任何内容。

    【讨论】:

    • 谢谢。这是我错过的开始......结束。非常感谢。
    • 嗯。刚试过这个。但是mysql抱怨IF'语法错误,意外的IF'
    • 这个答案唯一准确的是对 information_schema.columns 表的引用。剩下的就是让 OP 走上一条几乎没有机会真正提供可行解决方案的道路。
    • 你的批评可能是准确的,但没有解释是没有帮助的。
    • 这个答案只会选择两列或不选择任何一列......有没有办法只选择存在的那些?
    猜你喜欢
    • 2014-01-11
    • 2020-01-01
    • 1970-01-01
    • 2014-04-25
    • 2017-09-20
    • 2017-07-15
    • 2018-07-22
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多