5

このようなことを行うことは可能ですか(明らかにこの構文は機能しません):

SELECT a FROM (1, 2, 3)

これを取得するには:

| a |
+---+
| 1 |
| 2 |
| 3 |

つまり、テーブルを使用せずに、または少なくともdbにテーブルを作成せずに、コマ分離リストから行を作成したいのです(おそらく、これは一時テーブルのようなものを使用して可能ですか?)。

たぶん、selectを使用せずに、つまり他のSQLステートメントを使用して、指定された値の列を取得することは可能ですか?MySQLでは不可能であるが、他のSQLでは可能である場合でも、知ることは興味深いことです。

4

4 に答える 4

8
SELECT 1 a UNION ALL SELECT 2 a UNION ALL SELECT 3 a;
于 2012-11-15T10:09:12.863 に答える
2

一時テーブルはオプションでしょうか?次に、確かに、複数のクエリがある提案があります。

-- DROP TEMPORARY TABLE tmp_list IF EXISTS;
CREATE TEMPORARY TABLE tmp_list (a INT);
INSERT INTO tmp_list (a) VALUES (1), (2), (3);
SELECT a FROM tmp_list;
于 2012-11-15T10:17:50.743 に答える
2

MySQLでは不可能であるが、他のSQLでは可能である場合でも、知ることは興味深いことです。

標準SQLでは、これは次のようになります

select *
from ( values (1), (2), (3) ) t

これは、少なくともPostgreSQLとDB2では機能します。

PostgreSQLでは、エイリアスを拡張することで列に名前を付けることができます(その列のエイリアスがSQL標準の一部であるかどうかはわかりません)。

select *
from ( values (1), (2), (3) ) t (id)

以下は、一般的なテーブル式を使用した上記の代替手段です。

with my_values (id) as (
  values (1), (2), (3)
)
select *
from my_values;
于 2012-11-15T10:18:09.480 に答える
-1

MariaDBv10.3.3およびMySQLv8.0.19以降、まさにそれを実行できるようになりました。

ドキュメントを参照してください: MariaDBMySQL

MariaDB:

WITH mylist (a) AS (VALUES (1),(2),(3))
SELECT a FROM mylist

WITHMariaDBは。に適切な列名を提供しないため、ここを使用しましたVALUES ...。列名なしでユニオンで使用できます。

SELECT 1 AS a UNION ALL VALUES (2),(3)

また、ドキュメントにはそれについて言及されていないようですが、トップレベルのクエリとして使用することもできます。

VALUES (1),(2),(3) ORDER BY 1 DESC

実際の列名は実際には値の最初の行にすぎないため、これを行うこともできます(ただし、エレガントではなく、重複する列名エラーが発生する可能性があります)。

SELECT `4` AS a FROM (VALUES (4),(5),(6)) mylist

MySQL:

現在、テストするMySQL v8.0.19のインスタンスはありませんが、ドキュメント[編集:dbfiddle.ukを使用してMySQL v8.0.23で正常にテストされました、コメント#2のリンクを参照]によると、これらのいずれかが機能するはずです。 :

SELECT column_0 AS a FROM (VALUES ROW(1), ROW(2), ROW(3)) mylist

SELECT a FROM (VALUES ROW(1), ROW(2), ROW(3)) mylist(a)

MariaDBとは異なり、MySQLは自動列名column_0、column_1、column_2などを提供し、参照時にサブクエリのすべての列の名前変更もサポートします。

よくわかりませんが、この開発ワークログページは、MySQLが短い構文(MariaDBのように「ROW」を省略)も実装していることを示唆しているようです[編集:v8.0.26の時点ではまだ実装されていません)。近い将来、いくつかのpoiint。

于 2021-06-08T16:11:17.487 に答える