如何用硬编码值而不是子查询定义'with子句'?

时间:2017-01-30 21:31:34

标签: sql oracle parameters

我提供了几种值组合,需要使用它们构建查询。定义将返回这些结果的子查询似乎是浪费时间。相反,我正在考虑定义一个可以使用它们的'With Clause'。

举个简单的例子,我们假设我的查询采用了Country和City参数。

WITH INPUT_DATA AS (
'Canada' as COUNTRY
,'Toronto' as CITY
,'USA' as COUNTRY
,'Chicago' as CITY
)
SELECT * FROM SOME_TABLE WHERE COUNTRY=INPUT_DATA.COUNTRY AND CITY=INPUT_DATA.CITY

如果有另一种方法可以做到这一点,除了'with clause'和包之外,请分享。基本上,我想为此查询使用一些参数,而不必编写子查询来获取这些参数。当然,我需要它来支持多个“行”参数集。

请注意:Where子句不会。我不能将所有这些参数放在'where子句'中并且仍然清晰可辨。

1 个答案:

答案 0 :(得分:1)

with input_data as (
select 'Canada' as country, 'Toronto' as city from dual union all
select 'USA'    as country, 'Chicago' as city from dual
)
select * from some_table where (country, city) in (select country, city from input_data)
;

请注意,将使用第一组值中的列名称,您不需要在第二组及更高版本中重复它们(无论您放置什么,将忽略无论如何!)。此外,从Oracle 11.2开始,您可以将这些列名称放在WITH子句声明中,如下所示:

with input_data (country, city) as (
  select 'Canada', 'Toronto' from dual union all
  --   [ etc. ]
)

然而,说起来会简单得多

where (country, city) in ( ('Canada', 'Toronto'), ('USA', 'Chicago') )