2014-06-05 55 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