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

临时表是一种选择吗?然后我会有一个建议,诚然,它有超过 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;
于 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

从 MariaDB v10.3.3 和 MySQL v8.0.19开始,您现在可以做到这一点!

参见文档: MariaDBMySQL

玛丽亚数据库:

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

我在WITH这里使用了 a ,因为 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 实例,但根据文档[编辑:使用 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还实现了[编辑:尚未实现,截至 v8.0.26 ] 较短的语法(省略“ROW”,如 MariaDB),或者他们可能在在不久的将来的某个时间点。

于 2021-06-08T16:11:17.487 回答