2016-07-01 39 views
-1

C.FIRST_NAME、C.MIDDLE_NAME、C.LAST_NAME & C.NAME_SUFFIXを1つのフィールドに印刷します。場合によっては、C.NAME_SUFFIXがnullであり、それが他のフィールドと連結したくない場合は、他のフィールドと連結したくない場合は、他のフィールドと連結する必要があります。以下の例でC.MIDDLE_NAMEに行っています。name_suffixを確認してください

CASE WHEN C.MIDDLE_NAME = ' ' 
     THEN 
     C.FIRST_NAME || C.MIDDLE_NAME || C.LAST_NAME 
     ELSE 
     C.FIRST_NAME || ' ' || C.MIDDLE_NAME || ' ' || C.LAST_NAME 
    END 

ありがとう!

+0

はこの質問を削除します。次に、別の質問をして、サンプルデータと希望の結果を提供します。次に、あなたがしたいことを説明し、問題を解決しようとするコード(上記のようなもの)を提供してください。 –

+0

''''はOracleでは 'NULL'です。だから 'c.middle_name = '''は決して真ではないでしょう( 'NULL'は決して他の' NULL'を含む他の値と等しくないので)。 – MT0

答えて

0

異なるソリューション、Oracleのヌルとして空の文字列の処理、およびOracleのとSQL標準の3値ロジックは、次のようになります。

with 
    c (  first_name, middle_name, last_name , name_suffix) as (
     select 'John' , 'D'  , 'Smith' , ' '   from dual union all 
     select 'Mary' , 'Ann'  , 'Loury' , null   from dual union all 
     select 'Chris' , null  , 'Robson' , 'III'  from dual union all 
     select 'Greg' , 'Z.'  , 'Olson' , 'Jr.'  from dual union all 
     select 'Helen' , ' '  , 'Webb-Hunt', ' '   from dual 
    ) 
select first_name || ' ' || 
     case when middle_name != ' ' then (middle_name || ' ') end || 
     last_name || 
     case when name_suffix != ' ' then (' ' || name_suffix) end 
     as full_name 
from c; 

結果:

FULL_NAME 
----------------------- 
John D Smith 
Mary Ann Loury 
Chris Robson III 
Greg Z. Olson Jr. 
Helen Webb-Hunt 
0

あなたはこのCONCATENATEにはスペースを含めていない理由を私は少しわからないよ:

C.FIRST_NAMEを|| C.MIDDLE_NAME || C.LAST_NAME

NVLを使用してこれを書き直す方がよいでしょう(私はMSSQLについてよく知っていますが、あなたはOracleを使用していると思いますが、MSの "ISNULL" )。だから、あなたは単にこのように書くことで、NULLを考慮に入れることができます:

C.FIRST_NAME || '' || NVL(C.MIDDLE_NAME、 '')|| '' || C.LAST_NAME || NVL(C.NAME_SUFFIX、 '')

こうすれば、空白または空白の場合は空白に正規化します。スペースがある場所に多くの例がある場合は、おそらくTRIMを使ってそれらを ''に切り捨てることができます。例

TRIM( ') 'NVL(C.MIDDLE_NAME、FROM'' LEADING)

について次に、あなたは、すべてのcase文は必要ありません。うまくいけば、これはあなたのために働く。

+1

Oracleでは、空の文字列はNULLと同じですので、 'NVL(value、 '')は' value'と同じNVL(value、NULL)と同じです。 – MT0

1

RTRIM(value)は、value文字列のすべての後続スペースを削除します。

C.FIRST_NAME 
|| RTRIM(' ' || C.MIDDLE_NAME) 
|| ' ' || C.LAST_NAME 
|| RTRIM(' ' || C.NAME_SUFFIX) 

オラクル:あなたはvalueにスペースを付加し、その後RTRIM()を使用する場合valueNULLまたはスペースで完全に構成されている場合ので、その後、その後、文字列全体は連結を変更されませんNULLを残す剥ぎ取られますセットアップ

テストデータのために@mathguyに感謝します。

CREATE TABLE table_name (first_name, middle_name, last_name, name_suffix) AS 
SELECT 'John', 'D', 'Smith',  ' ' FROM DUAL UNION ALL 
SELECT 'Mary', 'Ann', 'Loury',  null FROM DUAL UNION ALL 
SELECT 'Chris', null, 'Robson', 'III' FROM DUAL UNION ALL 
SELECT 'Greg' , 'Z.', 'Olson',  'Jr.' FROM DUAL UNION ALL 
SELECT 'Helen', ' ', 'Webb-Hunt', ' ' FROM DUAL; 

クエリ

SELECT C.FIRST_NAME 
     || RTRIM(' ' || C.MIDDLE_NAME) 
     || ' ' || C.LAST_NAME 
     || RTRIM(' ' || C.NAME_SUFFIX) 
     AS full_name 
FROM table_name c; 

出力case条件に基づいて

FULL_NAME    
----------------------- 
John D Smith    
Mary Ann Loury   
Chris Robson III   
Greg Z. Olson Jr.  
Helen Webb-Hunt   
+0

申し訳ありませんが、私は完全な質問を投稿していません。 実際にC.FIRST_NAME、C.MIDDLE_NAME、C.LAST_NAME&C.NAME_SUFFIXを1つのフィールドに印刷したいので、場合によってはC.NAME_SUFFIXがnullです。それがヌルなら、私は他と一緒に追加したくないです。そうでなければ、C.MIDDLE_NAMEと同じように、それらの間にスペースを含む他のものを追加したいと思います。 今回は私がはっきりしていることを願っています。 – Developer

+0

@psftdeveloper - MT0のソリューションは、あなたが必要とするすべてを既に実行しています。私はちょうど私が投稿したサンプル入力でそれをテストしました(私のソリューションはMT0とは異なります) - 彼のソリューションは私のものと全く同じ結果を生み出します。 MT0が説明したように、 'name_suffix'がヌルか空白かスペースの場合、コードの最後の行のRTRIMは、その最後の行のすべてを空の文字列に崩壊させます。それ以外の場合は、スペースと接尾辞を追加します。 – mathguy

+0

@psftdeveloper私が投稿したクエリは、あなたが望むものとまったく同じです - 'middle_name'または' name_suffix'が 'NULL'または任意の数の空白文字の場合、それらは無視されます。それ以外の場合は、前のスペースが追加されます。 – MT0

関連する問題