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

Posted

技术标签:

【中文标题】如何选择几个硬编码的 SQL 行?【英文标题】:How to select several hardcoded SQL rows? 【发布时间】:2011-09-14 19:05:46 【问题描述】:

如果你执行这个查询

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 太难了。

【问题讨论】:

你有一张桌子可以选择吗? 您是否有不想使用联合的原因?是否存在大量值? 【参考方案1】:

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

【讨论】:

这是对我帮助最大的 Oracle 答案(请注意,也有针对字符串而不是数字的解决方案,请查看我的评论):***.com/questions/10353969/… @HLGEM 相反,UNION ALL 生成重复行,而 UNION 生成互斥行。【参考方案2】:

我很想知道是否有人有更好的解决方案。过去我用过这个:

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

【讨论】:

这是一个mysql问题,所以没有排名功能。但好主意! 这太糟糕了。在 t-sql 中,我滥用了 row_number()。【参考方案3】:

以下内容适用于 SQL:

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

【讨论】:

【参考方案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】:

Values 关键字可以如下使用。

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

【讨论】:

UNION ALL 答案比这个更受欢迎有什么原因吗? 这段代码 sn-p 不能在 MuSQL 5.6.25 中运行。它是 5.7 中的新功能吗? 这个例子在我的 MS SQL Server 中运行良好,但在 Oracle 中却不行。 在 10.6.4-MariaDB-1:10.6.4+maria~focal-log 上返回语法错误【参考方案6】:

为 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

【讨论】:

【参考方案7】:

在 MySQL 中,您可以像这样使用UNION

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

【讨论】:

不需要最终的 UNION【参考方案8】:

从 MySQL 8.0.19 开始,可以这样做

选择 column_0 AS 名称 1, column_1 AS 名称2 从 (价值观 行('test-a1','test-a2'), 行('test-b1','test-b2'), 行('test-c1','test-c2') ) AS 硬编码名称

返回

名称 1 名称 2 =================== 测试-a1 测试-a2 测试-b1 测试-b2 测试-c1 测试-c2

关于列名的注释

从 VALUES 输出的表的列具有隐式命名的列 column_0、column_1、column_2 等,始终以 0 开头。

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

【讨论】:

【参考方案9】:

以下代码在 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

【讨论】:

以上是关于如何选择几个硬编码的 SQL 行?的主要内容,如果未能解决你的问题,请参考以下文章

sql如何选择行=值的多行计数

SQL选择列邮政编码中的数据与数组中的数据匹配的任何行?

在 SQL Server 中,如何选择前 4 行?

如何检查当前行是不是是sql查询中最后选择的行?

如何在 SQL 中随机选择行?

SQL如何根据多行中的值选择行