是否可以做这样的事情(显然这种语法不起作用):
SELECT a FROM (1, 2, 3)
得到这个:
| a |
+---+
| 1 |
| 2 |
| 3 |
那就是我想从昏迷分隔列表中创建行,而不使用任何表,或者至少不在db中创建表(也许这可以使用像临时表这样的东西?)。
也许有可能在不使用select的情况下获取给定值的列,即使用其他一些sql语句?如果在MySQL中不可能,但在某些其他SQL中可能,那么知道它仍然会很有趣。
答案 0 :(得分:7)
SELECT 1 a UNION ALL SELECT 2 a UNION ALL SELECT 3 a;
答案 1 :(得分: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;
答案 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;
答案 3 :(得分:0)
从 MariaDB v10.3.3 和 MySQL v8.0.19 开始,您现在可以完全做到这一点!
查看文档:{{3}}、MariaDB
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 实例,但根据文档,其中任何一个都应该可以工作:
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 似乎表明 MySQL 也实现了较短的语法(省略了“ROW”,如 MariaDB),或者他们将在不久的将来实现。