2

小売および法人の顧客がいるテーブルから選択しています。結果セットで、法人顧客と小売顧客の両方の名前を 1 つの列に返す必要があります。現在、次のように 2 つの異なる列でそれらを返しています。

select e.cust_id, 
       e.cust_location, 
       f.location
       max(case 
             when e.preferredname is not null 
             then e.preferredname 
           end
          )RETAIL_CUST_NAME,
       max(case 
             when e.preferredname is null 
             then e.CORP_NANME 
           end 
          )CORPORATE_CUST_NAME 
  from Mytable e, 
       myothertable f 
 where e.cust-id = f.cust_id
 group by e.cust_id, 
       e.cust_location, 
       f.location, 
       e.preferredname, 
       e.corp_name;

私がやろうとしていることは可能ですか?小売用と法人顧客用に別の列を返さなくても、どうすればこれを達成できますか?

4

3 に答える 3

5

2 つのフィールドのうち 1 つだけが入力された場合、入力された方を 1 つの列として返すのは非常に簡単です。

select e.cust_id, 
      e.cust_location, 
      f.location
      coalesce(e.preferredname, e.CORP_NANME) as CUST_NAME,
from Mytable e
     join myothertable f on e.cust_id = f.cust_id

coalesce最初に遭遇した null 以外の値を返します。

クエリの集計のポイントがわからないので、省略しました。


脚注として、Oracle では、nvlは と非常によく似ていますがcoalesce、次の重要な違いがあります。

  1. nvl合体はn個のパラメータを取ることができますが、2つのパラメータしか取りません
  2. 関数または方程式がパラメーターとして渡されると、nvlすべてのパラメーターが評価されますが、coalesceそれぞれが順番に評価され、null 以外の値に達すると停止します (つまり、coalesce短絡評価を使用しますが、使用しnvlません) 。 .

nvl同様の目的で使用されることが多いため、これは非常に重要です。

于 2013-08-08T13:00:45.100 に答える
4

以下のようにクエリを書くと、1 つの列で両方の cust_name を取得できます

select e.cust_id, 
   e.cust_location, 
   f.location
   max(case 
         when e.preferredname is not null 
         then e.preferredname 
       Whene preferredname is null 
         then e.CORP_NANME 
       end 
      )CUST_NAME 
于 2013-08-08T13:05:19.087 に答える
3

はい、UNION(重複を除外する)またはUNION ALL(除外しない)を使用できます。

例えば

select 
case when e.preferredname is not null then e.preferredname end 
as RETAIL_CUST_NAME,
from Mytable e
union all
select case when e.preferredname is null then e.CORP_NANME end 
from Mytable e

またはCOALESCE、アランが言うように。coalesceどちらか一方を使用する場合 (次に を使用)、または同じ列内のエンティティを結合する場合( を使用)は少し異なりますUNION

于 2013-08-08T12:59:27.760 に答える