سؤال

أنا أتساءل عما إذا كان أي شخص يمكن أن تساعد لي مع تحليل كامل اسم المجال.أود أن فصل ذلك في lastname, firstname, الأوسط, لاحقة.

وهنا بعض مدخلات اسم تليها كم أود منهم أن يكون تحليل.

                           Parsed Stuff Begins Here-------------------------------------
    name                  | lastname  | firstname        |  middle initial   | suffix |
----------------------------------------------------------------------------------------
PUBLIC, JOHN              | PUBLIC    | JOHN             |  NULL             | NULL
PUBLIC, CHUN CH KIM       | PUBLIC    | CHUN CH KIM      |  NULL             | NULL
PUBLIC, MARY L            | PUBLIC    | MARY             |  L                | NULL
PUBLIC, FRED J JR         | PUBLIC    | FRED             |  J                | JR
PUBLIC, SUE ELLEN J SR    | PUBLIC    | SUE ELLEN        |  J                | SR

لدي قائمة من جميع لاحقة قيم واحد قادر على الدخول ، أي

JR, SR, I,II,III,IV,V,VI

لقد وصلت إلى نقطة حيث لا نفترق lastname و بقية الاسم ، ولكن لا أستطيع أن أفهم كيف تفعل بقية.أنا باستخدام oracle 10g.

هذا ليس سؤال في الواجب.انها مشكلة فعلية أنا أعمل في العمل.

هذا ما لدي حاليا:

 select id,
        name,
        substr(name,1, instr(name,',')-1) as lname,
        substr(name,(instr(name,',')+1),length(name)) as rest_of_the_name
 from    my_table
 where status='A';
هل كانت مفيدة؟

المحلول

لقد جزئيا حلها بالفعل - يمكنك استخدام الاستعلام الخاص بك كما فرعي وكسر المشكلة إلى أسفل قليلا ، على سبيل المثال:

select id, name, lname,
       case
       when substr(x, -2, 1) = ' '
       then substr(x, length(x) - 2)
       else x
       end as first_name, -- e.g. "SUE ELLEN"
       case
       when substr(x, -2, 1) = ' ' 
       then substr(x, -1)
       else null
       end as middle_initial, -- e.g. "J"
       suffix -- e.g. "SR"
from (
select id, name, lname, suffix,
       case when suffix is not null then
       substr(rest_of_the_name, 1, length(rest_of_the_name)-length(suffix)-1)
       else rest_of_the_name end
       as x -- e.g. "SUE ELLEN J"
from (
select id, name, lname, rest_of_the_name,
       case
       when substr(rest_of_the_name,-2)
            in (' I',' V')
       then substr(rest_of_the_name,-1)
       when substr(rest_of_the_name,-3)
            in (' JR',' SR',' II',' IV',' VI')
       then substr(rest_of_the_name,-2)
       when substr(rest_of_the_name,-4)
            in (' III')
       then substr(rest_of_the_name,-3)
       else null
       end as suffix -- e.g. "SR"
from (
select id,
       name, --e.g. "PUBLIC, SUE ELLEN J SR"
       trim(substr(name,1, instr(name,',')-1)) as lname, -- e.g. "PUBLIC"
       trim(substr(name,(instr(name,',')+1),length(name)))
          as rest_of_the_name -- e.g. "SUE ELLEN J SR"
from    my_table
where status='A'
)));

نصائح أخرى

هذه هي المشكلة التي سوف يكون هناك دائما البيانات أن يكسر ذلك.

ما إذا كان هناك 2 بالاحرف الاولى?ماذا لو الأحرف الأولى أولا ، كما ي إدغار هوفر ؟

كنت أذكر القيم "أن أحد قادرا على الدخول." يمكنك تغيير الطريقة القيم دخلت إلى القبض عليهم بالفعل منفصلين ؟

هنا ساذج يجيب على أساس استرجاع الاسم الأول والأخير, استرجاع مي بنفس الطريقة الاسم الأول ، وإزالة مي من rest_of_the_name' آخر الاسم.

SELECT
substr('John Q. Public',1, instr('John Q. Public',' ')-1) as FirstName,
substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')) as rest_of_the_name,
substr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),1, instr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),' ')-1) as MI,
replace(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')), substr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),1, instr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),' ')-1)) as LastName
FROM DUAL;

حدد SUBSTR(اسم, INSTR(اسم, ' ')+1) اسم العائلة ، SUBSTR(اسم, 1, INSTR(اسم, ' ')-1) كما الاسم الأول من أيا كان ،

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top