1

データを次の形式で表示したい:

First_Name  Mid_Name  Last_Name
All         Ahmad     Khan

これは私のコードです

select substr(customer_name1, 0, instr(customer_name1, ' ')-1) as first_name
     , substr(customer_name1, instr(customer_name1, ' ')+1) as mid_name 
     , ... as last_name
  from sttm_customers 
 where customer_name1 = 'ALI AHMAD KHAN'

レポートにlast_nameを追加する方法を教えてもらえますか?

4

5 に答える 5

4

ファーストネームとラストネームを確実に知る方法がないため、確実に行うことはできません。上記の例は空白での分割を示していますが、それは確実には行われません。

「ジョン・フィッツジェラルド・ケネディ」があれば、それは簡単です。あなたの名は「ジョン」、真ん中は「フィッツジェラルド」、最後は「ケネディ」です。問題ない。

「メアリー・アン・サマーズ」をお持ちの場合はどうなりますか?名は「MaryAnn」、姓は「Summers」である必要がありますが、空白で分割するとそれがわかりません。空白で分割すると、「Mary」、「Ann」、「Summers」が表示されますが、これは誤りです。

反対方向に、「Eddie VanHalen」がある場合はどうなりますか?「Eddie」は名、「Van Halen」は最後の名前ですが、空白を壊すと「Eddie」、「Van」、「Halen」になります。これは間違いです。

そのことについては、あなたは「メアリー・アン・ヴァン・ヘイレン」を持つことができました、そしてあなたは何をしますか?

結論:名前と名前を別々のデータポイントとしてキャプチャしていない場合、それらを確実に分割することはできません。

于 2012-12-14T14:19:26.873 に答える
1
SQL> select substr(customer_name1, 0, instr(customer_name1, ' ')-1) as first_name
  2       , substr(customer_name1, instr(customer_name1, ' ')+1,
  3                instr(customer_name1, ' ', -1, 1) - instr(customer_name1, ' ') - 1) as mid_name
  4       , substr(customer_name1, instr(customer_name1, ' ', -1) + 1) last_name
  5    from (select 'ALI AHMAD KHAN' customer_name1 from dual)
  6  /

FIR MID_N LAST
--- ----- ----
ALI AHMAD KHAN

これは、複数のミドルネームを持つ名前に対応します。

于 2012-12-14T13:57:47.547 に答える
0

これは少し醜いですが、それは各部分を分離します:

with data(customer_name1) as
(
    select 'ALI AHMAD KHAN'
    from dual
),
first(firstname, customer_name1) as
(
    select substr(customer_name1, 0, instr(customer_name1, ' ')-1) as first_name,
        ltrim(replace(customer_name1, substr(customer_name1, 0, instr(customer_name1, ' ')-1), '')) customer_name1
    from data
),
middle(firstname, middlename, customer_name1) as
(
    select firstname, 
        substr(customer_name1, 0, instr(customer_name1, ' ')-1) middlename,
        ltrim(replace(customer_name1, substr(customer_name1, 0, instr(customer_name1, ' ')-1), '')) customer_name1
     from first
)
select firstname, middlename, customer_name1 as LastName
from middle

SQL FiddlewithDemoを参照してください

于 2012-12-14T13:58:57.787 に答える
0

開始位置として-1を入力すると、サブ文字列は最後からカウントを開始し、その後

空白の命令を見つけてくださいそれが役立つことを願っています

于 2012-12-14T14:11:09.933 に答える
0

名、ミドルネーム、姓をフルネームから分離します。

うまくいきましoracle 11gた。たとえば、次の名前を含む1つのフィールド呼び出しunameを持つテーブルusernameについて考えてみます。

sachin ramesh tendulkar
shiva sudharson s
shiva kumar s
shiva nandhan s
shiva selvan s

名前を名、ミドルネーム、姓として分割するには、クエリの下で機能します。

select 
substr(uname,1, instr(uname,' ')) as firstname, 
substr(uname, instr(uname, ' '), instr(uname, ' ', 1, 2)-instr(uname, ' ')) as middlename,
substr(uname, instr(uname, ' ',1,2), length(uname)) as lastname from username;

結果は次のようになります。

sachin   ramesh  tendulkar
shiva    sudharson   s
shiva    kumar   s
shiva    nandhan     s
shiva    selvan  s
于 2017-04-05T04:37:14.613 に答える