1

SELECTと呼ばれる列に基づいて値を設定したいのLOCATIONですが、「TOWN」の値があるSELECT場合は値を設定し、 thenの値がない場合は値を設定します。LOCATIONLOCATION ='TOWN'SELECTLOCATION='CITY'

のテーブルには常に値がありますが、のテーブルLOCATION='CITY'から値を取得する必要があります。LOCATION='TOWN'これで値が返されない場合は、にフォールバックしLOCATION='CITY'ます。

これは同じ(単一)で実行できますかSELECT

これは単純なDECODEを使用して達成できるとは思いません。

4

3 に答える 3

2

使用できる手法はたくさんありますが、最適な方法は、複数のもの(場所、会社、顧客)を照会する必要があるか、単一のものを照会する必要があるか、および町のロケーションレコードが存在しない可能性によって異なります。

「CITY」よりも英数字で上位にソートする「TOWN」に依存する方法は次のとおりです。

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フィドルを作成しました。

City/Townを自分の値または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
于 2012-12-11T20:56:38.127 に答える
0

スキーマがわからなくても、必要な値が1つしかない場合は、これを試してください。

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 に答える