如何选择几个硬编码的SQL行?

时间:2011-06-14 15:01:20

标签: mysql sql oracle

如果您执行此查询

SELECT 'test-a1' AS name1, 'test-a2' AS name2

结果将是一行选择,其中两列具有以下值:

test-a1, test-a2

如何修改上述查询以选择多行,例如

test-a1, test-a2
test-b1, test-b2
test-c1, test-c2

我知道如何使用UNION执行此操作,但我觉得存在一种更简单的方法。

PS。对于这样一个基本问题很抱歉,google很难。

9 个答案:

答案 0 :(得分:38)

值关键字可以使用如下。

select * from 
(values ('test-a1', 'test-a2'), ('test-b1', 'test-b2'), ('test-c1', 'test-c2')) x(col1, col2)

答案 1 :(得分:36)

SELECT 'test-a1' AS name1, 'test-a2' AS name2 
UNION ALL 
SELECT 'test-b1', 'test-b2'
UNION ALL 
SELECT 'test-c1', 'test-c2'

答案 2 :(得分:21)

UNION ALL是最好的选择。它比UNION快,你将拥有互斥的行。

答案 3 :(得分:5)

为oracle扩展answer of @openshac,因为下面提到的代码适用于oracle:

SELECT 'test-a1' AS name1, 'test-a2' AS name2 from dual 
UNION ALL 
SELECT 'test-b1', 'test-b2' from dual
UNION ALL 
SELECT 'test-c1', 'test-c2' from dual

答案 4 :(得分:4)

您可以使用临时表,将其填满结果,然后从中进行选择

create table #tmpAAA (name1 varchar(10), name2 varchar(10))
insert into #tmpAAA (name1, name2) 
values ('test_a', 'test_b'),
       ('test_c', 'test_d'),
       ('test_e', 'test_f'),
       ('test_g', 'test_h'),
       ('test_i', 'test_j');
select * from #tmpAAA;

这将返回

name1   name2
==================
test_a  test_b
test_c  test_d
test_e  test_f
test_g  test_h
test_i  test_j

答案 5 :(得分:2)

我很想听到有人有更好的解决方案。过去我用过这个:

Select top 3 'Hardcode'
from tableWithLotsOfRows

你介意用123来切换abc吗?

select top 3 
    'test-A'+convert(varchar, row_number() over (order by PrimaryKey)),
    'test-B'+convert(varchar, row_number() over (order by PrimaryKey))
from tableWithLotsOfRows

应返回类似:

TestA1, Test-B1
TestA2, Test-B2
TestA3, Test-B3

答案 6 :(得分:0)

在mysql中,您可以使用union

select * from 
    (select 2006 as year union
     select 2007 as year union
     select 2008
    ) as years

答案 7 :(得分:0)

从MySQL 8.0.19开始,可以做到

SELECT
    column_0 AS name1,
    column_1 AS name2
FROM
    (VALUES
        ROW('test-a1','test-a2'),
        ROW('test-b1','test-b2'),
        ROW('test-c1','test-c2')
    ) AS hardcodedNames

返回哪个

name1   name2
==================
test-a1 test-a2
test-b1 test-b2
test-c1 test-c2

列名注释

从VALUES输出的表中的列具有隐式命名的列column_0,column_1,column_2,依此类推,始终以0开头。

此处的文档:skip

答案 8 :(得分:0)

以下代码在 MSSQL 环境中对我有用:

SELECT Name1,Name2 FROM(VALUES  ('test-a1', 'test-a2'),
                                   ('test-b1', 'test-b2'),
                                   ('test-c1', 'test-c2'))AS Test(Name1,Name2)

输出:

Name1   Name2
------- -------
test-a1 test-a2
test-b1 test-b2
test-c1 test-c2