选择不带表的硬编码值

Select hardcoded values without table

提问人:Richard Knop 提问时间:4/11/2013 更新时间:4/28/2023 访问量:75385

问:

我需要在不实际连接到任何表的情况下运行选择。我只需要一组预定义的硬编码值来循环:

foo
bar
fooBar

我想遍历这些值。我可以做:

select 'foo', 'bar', 'fooBar';

但这会将其作为一行返回:

 ?column? | ?column? | ?column? 
----------+----------+----------
 foo      | bar      | fooBar
(1 row)

我正在使用 Postgresql。

PostgreSQL数据库

评论


答:

180赞 Clodoaldo Neto 4/11/2013 #1
select a
from (
    values ('foo'), ('bar'), ('fooBar')
) s(a);

http://www.postgresql.org/docs/current/static/queries-values.html

评论

6赞 peschü 12/29/2019
可以写成“AS s(a)”而不是“s(a)”,这样可以更明确地表示“s(a)”为硬编码表命名,其中“a”是列名。
0赞 Lee Goddard 8/9/2022
@peschü - 当我尝试时有效。
2赞 Matheus Felipe 12/1/2022
工作得很好,但是这里到底是什么,为什么它知道如何返回值而不是元组?s
1赞 Algorythm 3/21/2023
@MatheusFelipe 是表名和列名。所以你也可以写。括号 () 不是必需的,但随后列名将获得默认名称 (即 )。saselect s.a(a)column1select s.column1
60赞 Vivek S. 5/28/2017 #2

要生成多个色谱柱,

SELECT * 
FROM (VALUES ('Foo', 25), ('Bar', 30), ('Baz', 35)) AS t(name, age);

输出

 name | age 
------+-----
 Foo  |  25
 Bar  |  30
 Baz  |  35

使用 unnest()

将数组扩展到一组行

select unnest(array['foo', 'bar', 'fooBar']);

演示

生成多个色谱柱

SELECT *
FROM unnest(
            ARRAY['foo', 'bar', 'fooBar'] 
           ,ARRAY[25, 30, 35]
           ) AS t(name, AGE);

输出:

 name  | age
-------+-----
 foo   |  25
 bar   |  30
 fooBar|  35

评论

2赞 Luca 7/11/2018
当只有一个值要取消嵌套时,这很有效,但当必须提供多个值时,很快就会变得不可读,因为您必须在许多不同的取消嵌套中分离值
3赞 Peter Krauss 6/4/2020
最简单、最完整的语法SELECT x, 2 y FROM unnest('{1,2,3}'::int[]) t(x);
0赞 Peter Krauss 6/4/2020
@Luke使用 my illustrated 等,您可以使用 LATERAL JOIN、CROSS JOIN、INTERSECTION 等和 express 数据类型。t(x)t2(x)
12赞 Solanki Vaibhav 2/24/2021 #3

Postgres SQL:

对于以单行和多列表示形式输出的静态数据,请使用以下查询:

select a,b,c from (values('foo','bar','fooBar')) s(a,b,c);

此 SQL 查询的结果:

enter image description here

评论

0赞 markdsievers 8/26/2022
我不认为这是 OP 所追求的,@Clodoaldo Neto 的答案是这种语法的正确方法。