web-dev-qa-db-ja.com

Mysql列が存在する場合にのみ列から選択する方法

列が存在するかどうかを確認できる必要があります。存在する場合は、そこからSELECTします。

いろいろなバリエーションを試していますが、それが可能かどうかさえわかりません。

これが私の最新の試みです:

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

何か案は?


編集


私はここで他の質問を見ました: MySQL、SQLのテーブルに列が存在するかどうかを確認してください

しかし、私はまだifステートメントに苦労しています。上記の質問の回答を使用して、列が存在するかどうかを確認できます。しかし、私の質問は、結果がtrueであることが判明した場合に、その列から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

前もって感謝します。

7
Linda Keating

このクエリは、列が存在するかどうかを示します。

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内ですべてを実行します。

8
James McDonnell

ユーザーがアップロードしたシートによって作成されたいくつかの製品テーブルがあるのと同じ状況に遭遇しました。シートに「廃止」という名前の列がない場合があったため、シートからすべての製品をインポートする必要がありましたが、廃止された製品はインポートしませんでした。

尋ねられた元の質問に基づいてクエリを変更していませんが、これが私の解決策です:

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. COUNT(*)を選択するときに列が存在しない場合でも使用されるMySqlをだますために、ダミーとして0 AS obsoleteを選択しています。
  2. 列モデルをt1.model = t2.modelと一致させるために、テーブルにt1とt2という名前を付けました。
0
Rehmat