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



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

举个简单的例子,假设我的查询采用国家/地区和城市参数。

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子句"和包之外还有另一种方法可以做到这一点,也请分享。基本上,我想为此查询使用一些参数,而无需编写子查询来获取这些参数。当然,我需要它来支持多个参数集的"行"。

请注意:where 条款不起作用。我无法将所有这些参数放在"where 子句"中,但仍然清晰易读。

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') )

最新更新