我想基于名为SELECT
的列LOCATION
值,但如果没有值,SELECT
如果{T}有'TOWN'值,我想要LOCATION
个值LOCATION ='TOWN'
的{{1}},然后是SELECT
的{{1}}值。
LOCATION='CITY'
表格中始终有值,但我们希望从LOCATION='CITY'
的表中获取值,如果这不返回任何值,则返回LOCATION='TOWN'
。
这可以在同一个({1}}中完成。
我不认为这可以使用简单的DECODE来完成。
答案 0 :(得分:2)
有许多技术可以使用,最好的方法取决于你是否需要查询多个whatevers(地点?公司?客户?)或只是一个,以及城镇位置记录的可能性现有。
这是一种依赖于“TOWN”排序比“CITY”更高的字母数字的方法:
select value
from ...
where id = whatever and
location = (
select max(location)
from ...
where ? = ? -- correlated on whatever the id is for this thing)
顺便说一句,听起来你已经过度规范化为实体 - 属性 - 值模式,所以要为这种类型的更多痛苦做好准备。
答案 1 :(得分:0)
这似乎更适合功能,但它是可能的(至少,基于我对你的问题的理解)。
我创建了一个sql fiddle来演示它。
用您的值或ID替换城市/城镇。 EXISTS
子句搜索您的第一级搜索(城市,根据您的问题) - 如果失败,则会回退到匹配else
条件(在本例中为城镇)。
SELECT id, population
FROM locations
WHERE
CASE WHEN EXISTS
(
SELECT id
FROM locations l2
WHERE location = 'City'
) THEN 'City'
ELSE
'Town'
END = location
答案 2 :(得分:0)
如果不知道架构,请尝试此选项,如果它只是您需要的一个值:
Select i.*,
NVL((select return_value from town where i.location = town and rownum<=1),
(select return_value from city where i.location = city and rownum<=1)) as value
From my_table i
或者如果它更多:
Select i.*,
Nvl(city.c1, town.c1) as value1,
Nvl(city.c2, town.c2) as value2
From my_table i, city, town
Where i.location=city.city(+)
And i.location=town.town(+)