Oracle regex لسرد اختلاف الأحرف الفريدة بين سلسلتين

StackOverflow https://stackoverflow.com/questions/1413198

  •  06-07-2019
  •  | 
  •  

سؤال

في Oracle 10G ، أود إنشاء تعبير منتظم لسرد الأحرف التي تختلف بين سلسلتين.

هنا هو السبب:لدي جدول يحتوي على حقل يحتوي أحيانًا على أحرف Unicode ليست باللغة الفرنسية.

أنا قادر على سرد الصفوف التي تحتوي على هذه الشخصيات غير المعيارية لإجراء تنظيف مستقبلي مع هذا الاستعلام:

SELECT DataID, Name, CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')  
  FROM table
  WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )

حيث WE8ISO8859P1 - أوروبا الغربية (التي أقبلها)

وWE8DEC - مجموعات أحرف 8 بت من شركة Digital Equipment Corporation (التي أعلم أن التطبيق يدعمها)

أتخيل أنه باستخدام تعبير Oracle العادي سأتمكن من استخراج قائمة بكل هذه الأحرف غير القياسية.لكنني لست على دراية بالتعبير العادي في Oracle لذا سيكون موضع تقدير أي مساعدة.

هذه هي فكرتي (غير العاملة):

select regexp_replace("éaé", '[a-z][A-Z]', '' ) from dual;

سيعطي "é" كحرف للتنظيف.

هل كانت مفيدة؟

المحلول

ربما شيء من هذا القبيل قد يجعلك تسير في الاتجاه الصحيح:

SQL> select regexp_replace('éaéABcdEF', '([a-zA-Z])', '' ) problems from dual;

PROBLEMS
--------
éé

فهو يوفر لك كل تكرار للأحرف التي تريد التعرف عليها، ولكن ربما لا يمثل ذلك مشكلة أو يمكنك تحسينها...

نصائح أخرى

أعتقد أن خطأك الوحيد كان استخدام علامات الاقتباس المزدوجة للمعلمة الأولى في سؤالك.عادةً ما يتم استخدام علامات الاقتباس المزدوجة فقط لأسماء الأعمدة/الجداول.

الأقواس التي أضافها DCookie تجعل التعبير العادي يتطابق عدة مرات.اعتمادًا على ما هو موجود في حقل الاسم، قد تحتاج إلى إضافة المزيد من الأحرف إلى عبارة الاستبدال، بما في ذلك علامات الترقيم (استخدم علامتي الاقتباس الفرديتين لمطابقة الاقتباس).هذه بداية لك:

SELECT regexp_replace(name, '([a-zA-Z ,.;''"])\-?','') problem_characters , count(*) 
FROM table
  WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )
group by regexp_replace(name, '([a-zA-Z ,.;''"])\-?','');
SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter) 
       FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter 
                     FROM dual CONNECT BY level <= length('aaaaabcde') )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top