2011-06-14 49 views
34

如果你執行這個查詢如何選擇多個硬編碼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做到這一點,但我覺得有一個更簡單的方法來做到這一點。

PS。對於這樣一個基本問題抱歉,它很難谷歌。

+0

你有一個表的選擇? – openshac 2011-06-14 15:16:13

+0

是否有你不想使用工會的原因?有很多值嗎? – NullRef 2011-06-14 15:17:45

回答

17

UNION ALL是最好的選擇。它比UNION快,你會有互斥的行。

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 
+0

這是一個MySQL問題,所以沒有排名功能。但好主意! – 2011-06-14 15:11:28

+1

這很糟糕。在t-sql我虐待了row_number()。 – TizzyFoe 2011-06-14 17:33:46

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

您可以使用一個臨時表,用你的結果填滿它,然後從中選擇

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 
23

值關鍵字可以使用如下。

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

爲什麼UNION ALL的答案比這個更受歡迎? – svz 2015-06-28 21:35:19

+4

此代碼片段無法在MuSQL 5.6.25中運行。它是5.7中的新功能嗎? – HKTonyLee 2016-01-22 08:51:44

+0

這個例子在MS SQL Server中適用於我,但在Oracle中不起作用。 – Graeck 2016-06-22 23:11:30

4

擴展answer of @openshac對於Oracle來說,如以下提到的代碼工作對於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