2014-06-05 83 views
2

在許多語言中,可以使用值的內嵌列表,其中一些類似這種形式的代碼:SQL語句陣列

for x in [1,7,8,12,14,56,123]: 
    print x # Or whatever else you fancy doing 

與SQL在過去一年左右的時間工作,我已經找到了,即使使用在沒有問題這樣的一個數組...

select * 
from foo 
where someColumn in (1,7,8,12,14,56,123) and someThingElse... 

...我還沒有找到一個等效的形式從一個內嵌陣列GET數據:

-- This is not working 
select * 
from (1,7,8,12,14,56,123) 
where somethingElse ... 

搜索解決方案,我只找到人建議工會湯:

select * 
from (SELECT 1 UNION SELECT 1 UNION SELECT 7 UNION ...) 
where somethingElse ... 

...這可以說是,醜陋的和冗長。

我可以在編輯器(VIM)中快速地從列表中生成UNION湯,然後將其粘貼回我的數據庫提示 - 但我想知道是否缺少一些其他方法來完成此操作。

而且,如果有這樣做沒有標準的方式,我仍然有興趣在DB-引擎特定的解決方案(甲骨文,PostgreSQL的,等等)

預先感謝任何指針。

+0

您不會錯過這樣做的標準方式。但是,你應該使用'union all'而不是'union'。 –

回答

1

行/表值構造有時可以用作短ISH相對,例如在MSSQL:

select * from (values (1),(7),(8),(12)) as T (f)

的語法是更復雜的方法必然比簡單的陣列 - 像列表傳遞給in(),因爲它必須能夠描述一個多維數據集:

select * from (values (1, 'a'),(7, 'b'),(8, 'c'),(12, 'd')) as T (f, n)

當然,當你發現要求列出字面值時,把它們粘在一張表中並查詢它們通常是一個好主意。

+0

謝謝。我在PostgreSQL上試了這個,並且它工作 - 但在Oracle中失敗了。 – ttsiodras