Mysql 如何仅在列存在时才从列中进行选择

问题描述 投票:0回答:3

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

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

这是我最新的尝试:

SELECT
IF (EXISTS (SELECT `Period` AS `Period` FROM myview), `PERIOD`,
IF (EXISTS (SELECT `Country` AS `COUNTRY` FROM myview),`COUNTRY` FROM myview ;

有什么想法吗?


编辑


我在这里看到了另一个问题:MySQL,使用 SQL 检查表中是否存在列

但我仍然对 if 语句感到困惑。我可以使用上面问题中的答案来检查该列是否存在。 但我的问题是 - 如果发现结果为真,如何从该列执行选择语句。


编辑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

提前致谢。

mysql select if-statement exists
3个回答
11
投票

此查询将告诉您列是否存在。

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
投票

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

我不会根据提出的原始问题修改我的查询,但这是我的解决方案:

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

此查询中有 2 个最重要的部分:

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

0
投票

我有一个类似的案例,并想出了这个,这可能适合某人。

WITH t AS (SELECT 'default' AS Period) SELECT OtherCol, Period FROM myview NATURAL LEFT JOIN t;

如果表“myview”中存在“Period”,它将使用该值,否则它将返回“默认”。当只有一列可能丢失时,我使用了它,我不确定如果有多个可选列,如何或是否可以重写它。

© www.soinside.com 2019 - 2024. All rights reserved.