سؤال

الخلفية

أنا أعمل على تصميم قاعدة البيانات على تطبيق المسارات المعلومات حول مشاريع تطوير قاعدة البيانات في الشركة.مكتب إدارة المشاريع (PMO) يعين psued-رقم لكل مشروع على أساس إن المشروع يتم احتساب التكاليف نحو الاندماج والتكامل أو لا.لتوضيح عدد المكلفين إما أن تبدأ مع الباحث (مشروع المساهمة في الاندماج والتكامل) أو NINT (مشروع لا تساهم في الاندماج والتكامل).ثم رقم تسلسلي يتم تعيين.على سبيل المثال ، INT175 سيكون 175 يستحق حدد المشروع المساهمة في الاندماج والتكامل.إضافية التجاعيد هو PMO في بعض الأحيان يريد إنشاء مشاريع متعددة مع نفس العدد كما هي "ذات الصلة".لذلك على سبيل المثال يمكن أن يكون هناك INT175a المشروع ، INT175ب مشروع, وهلم جرا.

في حين PMO ترى هذا العدد أن يكون معرف المشروع في قاعدة البيانات سوف تستخدم فقط العمود كبديل رئيسية فريدة من نوعها على حد سواء لضمان تكرار المشاريع لا يتم إنشاء ونتيجة البحث الرئيسية للمستخدمين.أريد أن تنفيذ التحقق من القيد على هذا العمود فقط لضمان رقم صالح مطابقة القواعد أعطى أعلاه يمكن إدخالها.

لقد حاولت - التعبيرات العادية

كانت فكرتي الأولى أن استخدام تعبير عادي.في أوراكل ، هدفي قاعدة البيانات لدينا REGEX_LIKE وظيفة التي يمكن استخدامها.بحثت الوثائق (هنا, هنا, هنا, هنا, ، هنا ) على التعبيرات العادية وجدت خيارات مذهلة!لأي سبب كان عقلي يحصل متشابكة تحاول أن تأخذ قائمة كل نمط مختلف خيارات مطابقة وتطبيقه إلى مثال محدد.أنا واحد من هؤلاء الناس الذين تعمل بشكل أفضل مع الأمثلة.للأسف, لم أجد أمثلة كثيرة هناك.ما وجدت إما بسيطة جدا أو معقدة جدا لم أستطع فهم لهم.

ما كنت قد حاولت حتى الآن هو شيء من هذا القبيل:

select c
from (
  select 'INT1756b' c from dual union all
  select 'INT175a' c from dual union all
  select 'INT75a' c from dual union all
  select 'INT75' c from dual union all
  select 'NINT2283a' c from dual union all
  select 'NINT2283' c from dual union all
  select 'NINT915c' c from dual union all
  select 'NINT915' c from dual union all
  select 'NINT95b' c from dual union all
  select 'NINT95' c from dual union all
  select 'ABC123' c from dual
) x
where REGEXP_LIKE ( c, '(NINT|INT)\d{2}[0-9]|[a-z]' );

اختباري "الجدول" x ما أتوقع كمثال على جميع التوليفات الممكنة من أرقام صالح زائد واحد رقم غير صالح.فإنها إما أن تبدأ مع الباحث أو NINT, ثم لديك على الأقل 2 أرقام تصل إلى 4 أرقام ثم اختياريا حالة انخفاض رسالة على النهاية.

كفاحي - التعامل مع فترات متفاوتة

ما أنا حقا تكافح مع كيفية التعامل مع أطوال مختلفة من الأرقام.لا يمكن أن يكون 2 أو 3 أو 4 أرقام التي قد تكون أو لا تكون ثم تليها حالة انخفاض الرسالة.ما جاء أعلاه مجرد بداية ، كان للبحث عن 2 أرقام بعد الباحث أو NINT.أعلم أن هناك من سوف دائما يكون اثنين على الأقل من الأرقام.ثم أنا فقط ابحث لمعرفة ما إذا كان الباقي في مجموعة من الأرقام أو الأحرف.الآن أنا أعلم هذا ليس جيدا بما فيه الكفاية ولكن هذا هو كل ما يمكن أن يأتي بعد يوم أو يومين من أعصر مخي على هذا.

نداء للحصول على مساعدة!

وقد أي شخص من أي فعلت شيئا من هذا القبيل مع التعبيرات العادية الذي يمكن لي نقطة في الاتجاه الصحيح أو أن تعطيني مثالا ؟ هل هناك أكثر أناقة و طريقة بسيطة لتنفيذ هذا القيد?وأنا أقدر أي مساعدة ومؤشرات!

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

المحلول

هذا ليس حقا إدارة قواعد البيانات السؤال, ولكن...

أولا: النمط الخاص بك لا يمنع إدخالات مثل هذا: XXXINT123abogus, لأنه لا يقول هذا "الباحث" أو "NINT" يجب أن يكون في بداية السلسلة ، ولا أقول أن حرف صغير ، إذا كان هناك يجب أن يكون الرمز الأخير من السلسلة.

قد ترغب في محاولة شيء من هذا القبيل:

 +----------------------------- begins with
 |+---------------------------- optional "N"
 ||  +------------------------- then "INT"
 ||  |  +---------------------- then digits
 ||  |  | +-------------------- minimum 2
 ||  |  | | +------------------ maximum 4
 ||  |  | | |   +-------------- then a lowercase letter
 ||  |  | | |   |  +----------- which is optional
 ||  |  | | |   |  |+---------- and nothing more
 ||  |  | | |   |  ||
 ||  |  | | |   |  ||
'^N?INT\d{2,4}[a-z]?$' 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى dba.stackexchange
scroll top