24

これが私がやろうとしていることです-私はたくさんの列を持つテーブルを持っていて、他の列の値の特定の組み合わせに基づいて再割り当てされた列の1つでビューを作成したいと思います。

Name, Age, Band, Alive ,,, <too many other fields)

そして、フィールドの1つを再割り当てするクエリが必要です。

Select *, Age = 
CASE When "Name" = 'BRYAN ADAMS' AND "Alive" = 1 THEN 18
     ELSE "Age"
END
FROM Table

しかし、私が今持っているスキーマはName, Age, Band, Alive,,,,<too many>,, Age

選択したステートメントで「AS」を使用して作成できます Name, Age, Band, Alive,,,,<too many>,, Age_Computed.

Name, Age, Band, Alive.,,,,ただし、 Ageが実際に計算された年齢である元のスキーマに到達したいと思います 。

私ができる選択的な名前変更はありますSELECT * and A_1 as A, B_1 as bか?(そしてA_1は完全に消えます)または選択的*特定の列を除くすべてを選択できますか?(これは前のステートメントで尋ねられた質問も解決します)

私はすべての列を列挙して適切なクエリを作成するというハッキーな方法を知っていますが、これを行うための「より簡単な」方法があることを願っています。

4

3 に答える 3

14

申し訳ありませんが、いいえ、必要に応じて構成を使用して既存の列名を置き換える方法はありませんSELECT *

特にビューの場合は、列を明示的に定義し、決して使用しないことをお勧めしますSELECT *。ビューを作成するときは、テーブルのDDLをモデルとして使用するだけです。そうすれば、(質問のように)必要な列定義を変更して、ビューに不適切な列を削除できます。この手法を使用して、社会保障番号やパスワードなどの機密データを含む列をマスクまたは削除します。コメントでmarc_sによって提供されたリンクはよく読まれています。

于 2012-12-25T16:15:51.467 に答える
4

Google BigQueryは以下をサポートしますSELECT * REPLACE

SELECT * REPLACEステートメントは、1つ以上の式ASID句を指定します。各識別子は、SELECT*ステートメントの列名と一致する必要があります。

出力列リストで、REPLACE句の識別子に一致する列が、そのREPLACE句の式に置き換えられます。

SELECT * REPLACEステートメントは、列の名前や順序を変更しません。ただし、値と値の型は変更できます。


Select *, Age = CASE When "Name" = 'BRYAN ADAMS' AND "Alive" = 1 THEN 18
                     ELSE "Age"
                END
FROM tab
=>
SELECT * REPLACE(CASE WHEN Name = 'BRYAN ADAMS' AND Alive = 1 THEN 18
                      ELSE Age END AS Age)
FROM Tab
于 2018-09-09T11:11:20.660 に答える
1

実際、MySQLでこれを行う方法があります。ここに投稿されているように、ハックを使用して1つを除くすべての列を選択し、ASステートメントに個別に追加する必要があります。

次に例を示します。

-- Set-up some example data
DROP TABLE IF EXISTS test;
CREATE TABLE `test` (`ID` int(2), `date` datetime, `val0` varchar(1), val1 INT(1), val2 INT(4), PRIMARY KEY(ID, `date`));
INSERT INTO `test` (`ID`, `date`, `val0`, `val1`, `val2`) VALUES
(1, '2016-03-07 12:20:00', 'a', 1, 1001),
(1, '2016-04-02 12:20:00', 'b', 2, 1004),
(1, '2016-03-01 10:09:00', 'c', 3, 1009),
(1, '2015-04-12 10:09:00', 'd', 4, 1016),
(1, '2016-03-03 12:20:00', 'e', 5, 1025);

-- Select all columns, renaming 'val0' as 'yabadabadoo':
SET @s = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'val0,', '') 
  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND TABLE_SCHEMA = 
  '<database_name>'), ', val0 AS `yabadabadoo` FROM test');

PREPARE stmt1 FROM @s;
EXECUTE stmt1; 
于 2020-10-19T14:53:35.893 に答える