如果TOWN不可用,请选择CITY

时间:2012-12-11 20:14:02

标签: sql oracle

我想基于名为SELECT的列LOCATION值,但如果没有值,SELECT如果{T}有'TOWN'值,我想要LOCATION个值LOCATION ='TOWN'的{​​{1}},然后是SELECT的{​​{1}}值。

LOCATION='CITY'表格中始终有值,但我们希望从LOCATION='CITY'的表中获取值,如果这不返回任何值,则返回LOCATION='TOWN'

这可以在同一个({1}}中完成。

我不认为这可以使用简单的DECODE来完成。

3 个答案:

答案 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(+)