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

如果执行此查询

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 做到这一点,但我觉得有一个更简单的方法来做到这一点。

另外,对于这样一个基本的问题,我很抱歉,很难谷歌它。

88944 次浏览

UNION ALL 是最好的选择。它比 UNION 更快,并且您将拥有相互排斥的行。

我很想听到有人有更好的解决办法,过去我用过这个:

Select top 3 'Hardcode'
from tableWithLotsOfRows

你介意把 abc 调到123吗?

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

以下内容适用于 SQL:

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

您可以使用一个临时表,用结果填充它,然后从中进行选择

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

关键字可以如下所示使用。

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

扩展 Oracle 的 @ 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

在 MySQL 中你可以这样使用 UNION:

SELECT * from
(SELECT 2006 AS year UNION
SELECT 2007 AS year UNION
SELECT 2008 AS year UNION
) AS years

在 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 column _ 0、 column _ 1、 column _ 2等等,总是以0开头。

文档在此: https://dev.mysql.com/doc/refman/8.0/en/values.html

以下代码适用于 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