如何选择几个硬编码的 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 行?的主要内容,如果未能解决你的问题,请参考以下文章