有没有可能做到这样的事情(显然这种语法是不起作用的):
SELECT a FROM (1, 2, 3)
为了获得这个:
| a |
+---+
| 1 |
| 2 |
| 3 |
我希望从逗号分隔的列表中创建行,而不使用任何表格,或者至少不在数据库中创建表格(也许可以使用类似临时表的东西来实现?)。
也许可以通过使用其他SQL语句而不是select语句获取给定值的列?如果在MySQL中无法实现,但在其他SQL中可以实现,仍然很有趣。
有没有可能做到这样的事情(显然这种语法是不起作用的):
SELECT a FROM (1, 2, 3)
| a |
+---+
| 1 |
| 2 |
| 3 |
我希望从逗号分隔的列表中创建行,而不使用任何表格,或者至少不在数据库中创建表格(也许可以使用类似临时表的东西来实现?)。
也许可以通过使用其他SQL语句而不是select语句获取给定值的列?如果在MySQL中无法实现,但在其他SQL中可以实现,仍然很有趣。
SELECT 1 a UNION ALL SELECT 2 a UNION ALL SELECT 3 a;
UNION ALL
而不是UNION
。 - Arion是否考虑使用临时表?我有一个建议,尽管需要多于1个查询:
-- 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;
如果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;
从MariaDB v10.3.3和MySQL v8.0.19开始,您现在可以准确地做到这一点!
MariaDB:
WITH mylist (a) AS (VALUES (1),(2),(3))
SELECT a FROM mylist
我在这里使用了WITH
,因为MariaDB没有为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的实例可以测试,但根据文档 [编辑:在MySQL v8.0.23上使用dbfiddle.uk成功测试,参见评论#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)