1

我想SELECT基于一个名为 的列来取值,LOCATIONSELECT如果LOCATION没有 'TOWN' 的值,我想评估 'TOWN' 的值。LOCATION ='TOWN'SELECTLOCATION='CITY'

表中总是有值,LOCATION='CITY'但我们想从表中获取值LOCATION='TOWN',如果它没有返回值,则回退到LOCATION='CITY'.

这可以在同一个(单个)中完成吗SELECT

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

4

3 回答 3

2

有许多技术可以使用,最好的方法取决于您是需要查询多个什么(地点?公司?客户?)还是只需要一个,以及城镇位置记录不存在的可能性。

这是一种依赖于“TOWN”排序高于“CITY”的字母数字的方法:

select value
from   ...
where  id = whatever and
       location = (
         select max(location)
         from   ...
         where  ? = ? -- correlated on whatever the id is for this thing)

顺便说一句,听起来您已经过度规范化为实体属性值模式,因此请为这种类型的更多痛苦做好准备。

于 2012-12-11T20:50:08.333 回答
0

这似乎更适合一个函数,但它是可能的(至少,基于我对你的问题的理解)。

我创建了一个sql fiddle来演示它。

用您的值或 ID 替换 City/Town。该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
于 2012-12-11T20:56:38.127 回答
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(+)
于 2012-12-15T02:21:51.770 回答