بيانات الفرع في أمر SELECT. تحويلات NVL لأنواع البيانات المختلفة

12.04.2019

لقد تطرقنا إلى الوظائف المتداخلة في وقت سابق، والآن سننظر إليها بمزيد من التفصيل. سننظر أيضًا في وظائف العمل باستخدام القيمة NULL والوظائف التي تساعد في تنفيذ عملية التفرع في الاستعلام.

وظائف متداخلة

تستخدم الوظائف المتداخلة القيمة المرجعة لوظيفة واحدة كمعلمة إدخال لوظيفة أخرى. تقوم الدالات دائمًا بإرجاع قيمة واحدة فقط. ولذلك، يمكنك التعامل مع نتيجة استدعاء دالة كقيمة حرفية عند استخدامها كمعلمة لاستدعاء دالة أخرى. يمكن تداخل وظائف السلسلة في أي مستوى تداخل. يبدو استدعاء دالة واحدة هكذا

الوظيفة 1 (المعلمة 1، المعلمة 2، ...) = النتيجة

يمكن أن يؤدي استبدال معلمة دالة باستدعاء دالة أخرى إلى ظهور تعبيرات مثل

F1(param1.1، F2(param2.1، param2.2، F3(param3.1))، param1.3)

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

  1. يتم تقييم الدالة F3(param1) ويتم استخدام القيمة المرجعة كمعلمة ثالثة للدالة 2، لنسميها param2.3
  2. ثم يتم تقييم الدالة F2(param1, param2.2, param2.3) ويتم استخدام القيمة المرجعة كمعلمة ثانية للدالة F1 - param1.2
  3. وأخيرًا، يتم تقييم الدالة F1(param1, param2, param1.3) ويتم إرجاع النتيجة إلى برنامج الاستدعاء.

وبالتالي، تكون الدالة F3 في مستوى التداخل الثالث.

دعونا ننظر في الطلب

حدد next_day(last_day(sysdate)-7, 'tue') من الثنائي;

  1. هناك ثلاث وظائف في هذا الاستعلام، من المستوى الأدنى إلى المستوى الأعلى - SYSDATE، LAST_DAY، NEXT_DAY. يتم تنفيذ الطلب على النحو التالي
  2. يتم تنفيذ الدالة SYSDATE المتداخلة. يقوم بإرجاع وقت النظام الحالي. لنفترض أن التاريخ الحالي هو 28 أكتوبر 2009
  3. بعد ذلك، يتم حساب نتيجة دالة المستوى الثاني LAST_DAY. LAST_DATE('28-OCT-2009') يُرجع اليوم الأخير من شهر أكتوبر 2009، وهو 31 أكتوبر 2009.
  4. ثم يتم طرح سبعة أيام من هذا التاريخ - فيصبح يوم 24 أكتوبر.
  5. أخيرًا، يتم تقييم الدالة NEXT_DAY('24-OCT-2009', 'tue') ويعرض الاستعلام يوم الثلاثاء الأخير من شهر أكتوبر - وهو في مثالنا 27-OCT-2009.

من الصعب جدًا فهم وبناء التعبيرات المعقدة باستخدام العديد من استدعاءات الوظائف المتداخلة، ولكن هذا يأتي مع الوقت والممارسة. يمكنك تقسيم هذه التعبيرات إلى أجزاء واختبارها بشكل منفصل. يعد الجدول DUAL مفيدًا جدًا لاختبار الاستعلامات ونتائج استدعاء الوظائف. يمكنك اختبار وتصحيح المكونات الصغيرة، والتي يتم دمجها بعد ذلك في تعبير واحد كبير مرغوب.

وظائف المتفرعة

تُستخدم الوظائف الفرعية، المعروفة أيضًا باسم IF-THEN-ELSE، لتحديد مسار التنفيذ اعتمادًا على بعض الظروف. تقوم الدالات المتفرعة بإرجاع نتائج مختلفة بناءً على نتيجة تقييم الحالة. تتضمن مجموعة هذه الوظائف وظائف للعمل مع القيمة NULL: NVL، NVL2، NULLIF وCOALESCE. وكذلك الوظائف المشتركة التي تمثلها الدالة DECODE وتعبير CASE. الدالة DECODE هي إحدى وظائف Oracle، بينما يكون تعبير CASE موجودًا في معيار ANSI SQL.

وظيفة NVL

تختبر الدالة NVL قيمة عمود أو تعبير من أي نوع بيانات مقابل NULL. إذا كانت القيمة NULL، فإنها تُرجع قيمة افتراضية بديلة غير NULL، وإلا فإنها تُرجع القيمة الأصلية.

تحتوي وظيفة NVL على معلمتين مطلوبتين وبناء الجملة هو NVL(original, ifnull) حيث original هي القيمة الأصلية المطلوب التحقق منها وifnull هي النتيجة التي يتم إرجاعها بواسطة الدالة إذا كانت القيمة الأصلية NULL. يجب أن يكون نوع بيانات المعلمات ifnull والأصلية متوافقًا. أي أنه إما أن يكون نوع البيانات هو نفسه أو يجب أن يكون من الممكن تحويل القيم ضمنيًا من نوع إلى آخر. ترجع الدالة NVL قيمة من نفس نوع البيانات مثل نوع بيانات المعلمة الأصلية. دعونا ننظر في ثلاثة استفسارات

الاستعلام 1: حدد nvl(1234) من ثنائي؛

الاستعلام 2: حدد nvl(null, 1234) من ثنائي;

الاستعلام 3: حدد nvl(substr('abc', 4), 'لا توجد سلسلة فرعية') من ثنائي؛

نظرًا لأن وظيفة NVL تتطلب معلمتين، فسيعرض الطلب 1 الخطأ ORA-00909: عدد غير صالح من الوسائط. سيرجع الاستعلام 2 1234 لأنه تم تحديد القيمة NULL وهي فارغة. يستخدم الاستعلام الثالث دالة SUBSTR متداخلة تحاول استخراج الحرف الرابع من سلسلة طويلة مكونة من ثلاثة أحرف، مما يؤدي إلى إرجاع NULL، كما تقوم وظيفة NVL بإرجاع السلسلة "لا توجد سلسلة فرعية".

تعد وظيفة NVL مفيدة جدًا عند التعامل مع الأرقام. يتم استخدامه لتحويل القيم NULL إلى 0 بحيث لا ترجع العمليات الحسابية على الأرقام NULL

وظيفة NVL2

توفر الدالة NVL2 وظائف أكثر من NVL، ولكنها تعمل أيضًا على التعامل مع القيم NULL. يقوم باختبار قيمة عمود أو تعبير من أي نوع مقابل NULL. إذا لم تكن القيمة NULL، فسيتم إرجاع المعلمة الثانية، وإلا يتم إرجاع المعلمة الثالثة، على عكس وظيفة NVL، والتي في هذه الحالة ترجع القيمة الأصلية.

تحتوي الدالة NVL2 على ثلاث معلمات مطلوبة وصياغة الجملة هي NVL2(original, ifnotnull, ifnull)، حيث original هي القيمة التي يتم اختبارها، وifnotnull هي القيمة التي يتم إرجاعها إذا كانت original ليست فارغة، وifnull هي القيمة التي يتم إرجاعها إذا كانت original هي NULL. يجب أن تكون أنواع البيانات الخاصة بمعلمتي ifnotnull وifnull متوافقة، ولا يمكن أن تكون من النوع LONG. نوع البيانات الذي يتم إرجاعه بواسطة الدالة NVL2 يساوي نوع بيانات المعلمة ifnotnull. دعونا نلقي نظرة على بعض الأمثلة

الاستعلام 1: حدد nvl2(1234, 1, 'a string') من ثنائي؛

الاستعلام 2: حدد nvl2(null, 1234, 5678) من ثنائي؛

الاستعلام 3: حدد nvl2(substr('abc', 2), 'Not bc', 'No substring') من ثنائي؛

المعلمة ifnotnull في الطلب 1 هي رقم، والمعلمة ifnull عبارة عن سلسلة. نظرًا لأن أنواع البيانات غير متوافقة، يتم إرجاع الخطأ "ORA-01722: رقم غير صالح". يقوم الاستعلام الثاني بإرجاع المعلمة ifnull، حيث أن الأصل هو NULL وستكون النتيجة 5678. يستخدم الاستعلام الثالث الدالة SUBSTR التي ترجع 'bc' وتستدعي NVL2('bc','Not bc','No substring') - والتي ترجع المعلمة ifnotnull – "ليس قبل الميلاد".

دالة NULLIF

تتحقق الدالة NULLIF مما إذا كانت القيمتان متطابقتين. إذا كانت هي نفسها، يتم إرجاع NULL، وإلا يتم إرجاع المعلمة الأولى. تحتوي الدالة NULLIF على معلمتين مطلوبتين وبناء الجملة هو NULLIF(ifunequal, Compare_item). تقارن الدالة بين معلمتين، وإذا كانتا متطابقتين، فسيتم إرجاع NULL، وإلا فستكون المعلمة غير متساوية. دعونا ننظر في الطلبات

الاستعلام 1: حدد nullif(1234, 1234) من ثنائي؛

الاستعلام الأول يُرجع NULL نظرًا لأن المعلمات متطابقة. لا يتم تحويل السلاسل الموجودة في الاستعلام 2 إلى تاريخ، بل يتم مقارنتها كسلاسل. وبما أن السلاسل ذات أطوال مختلفة، فسيتم إرجاع المعلمة ifunequal في 24 يوليو 2009.

في الشكل 10-4، تم دمج الدالة NULLIF داخل الدالة NVL2. تستخدم الدالة NULLIF بدورها الدالتين SUBSTR وUPPER كجزء من تعبير في المعلمة ifunequal. تتم مقارنة عمود البريد الإلكتروني بهذا التعبير، الذي يُرجع الحرف الأول من الاسم الأول مدمجًا مع الاسم الأخير للموظفين الذين يبلغ طول اسمهم الأول 4 أحرف. عندما تكون هذه القيم متساوية، ستُرجع NULLIF NULL، وإلا فإنها ستُرجع قيمة المعلمة ifunequal. يتم استخدام هذه القيم كمعلمة لوظيفة NVL2. يقوم NVL2 بدوره بإرجاع وصف لما إذا كانت العناصر المقارنة متطابقة أم لا.

الشكل 10-4 - استخدام الدالة NULLIF

وظيفة التئام

ترجع الدالة COALESCE أول قيمة غير فارغة من قائمة المعلمات. إذا كانت كافة المعلمات فارغة، فسيتم إرجاع NULL. تحتوي الدالة COALESCE على معلمتين مطلوبتين وأي عدد من المعلمات الاختيارية ويكون بناء الجملة هو COALESCE(expr1, expr2, ..., exprn) حيث ستكون النتيجة expr1 إذا لم تكن قيمة expr 1 فارغة، وإلا ستكون النتيجة expr2 إذا لم يكن فارغًا، وما إلى ذلك. COALESCE يساوي في المعنى وظائف NVL المتداخلة

التحام (expr1، expr2) = NVL (expr1، expr2)

التئام(expr1, expr2, expr3) = NVL(expr1,NVL(expr2, expr3))

نوع بيانات القيمة التي تم إرجاعها إذا تم العثور على قيمة غير فارغة يساوي نوع بيانات القيمة غير الفارغة الأولى. لتجنب الخطأ "ORA-00932: أنواع بيانات غير متناسقة"، يجب أن تكون جميع المعلمات غير NULL متوافقة مع المعلمة الأولى غير NULL. دعونا ننظر إلى ثلاثة أمثلة

الاستعلام 1: حدد الدمج (فارغ، خالي، خالي، "سلسلة") من ثنائي؛

الاستعلام 2: حدد الاندماج (فارغ، فارغ، فارغ) من ثنائي؛

الاستعلام 3: حدد الدمج (substr('abc', 4), 'Not bc', 'No substring') من ثنائي؛

يقوم الاستعلام 1 بإرجاع المعلمة الرابعة: سلسلة، نظرًا لأنها المعلمة الأولى غير NULL. يقوم الاستعلام الثاني بإرجاع NULL لأن كافة المعلمات فارغة. يقوم الاستعلام 3 بتقييم المعلمة الأولى، والحصول على القيمة NULL، وإرجاع المعلمة الثانية نظرًا لأنها المعلمة الأولى غير NULL.

قد تكون معلمات وظيفة NVL2 مربكة إذا كنت معتادًا على وظيفة NVL. NVL(original, ifnull) تُرجع القيمة الأصلية إذا لم تكن القيمة NULL، وإلا ifnull. NVL2(original, ifnotnull, ifnull) يُرجع ifnotnull إذا لم يكن الأصلي NULL وإلا ifnull. يأتي الارتباك من حقيقة أن المعلمة الثانية لوظيفة NVL هي ifnull، بينما في NVL2 تكون ifnotnull. لذلك لا تعتمد على موضع المعلمة في الوظيفة.

وظيفة فك التشفير

تطبق الدالة DECODE منطق if-then-else عن طريق اختبار المعلمتين الأوليين للمساواة وإرجاع قيمة ثالثة إذا كانتا متساويتين أو قيمة مختلفة إذا لم تكونا متساويتين. تحتوي الدالة DECODE على ثلاث معلمات مطلوبة ويكون بناء الجملة هو DECODE(expr1, comp1, iftrue1, , ). يتم استخدام هذه المعلمات كما هو موضح في مثال الكود الكاذب التالي

إذا expr1 = comp1 ثم قم بإرجاع iftrue1

وإلا إذا كانت expr1=comp2، فارجع iftrue2

وإلا، إذا كانت exprN=compN، فارجع iftrueN

وإلا قم بإرجاع NULL|iffalse;

أولاً، تتم مقارنة expr1 مع comp1. إذا كانت متساوية، يتم إرجاع iftrue1. إذا كانت expr1 لا تساوي comp1، فإن ما يحدث بعد ذلك يعتمد على ما إذا تم تحديد المعلمات comp2 وiftrue2. إذا تم تقديمها، تتم مقارنة قيمة expr1 مع comp2. إذا كانت القيم متساوية، فسيتم إرجاع iftrue2. إذا لم يكن الأمر كذلك، إذا كان هناك أزواج من المعلمات compN، وiftrueN، وexpr1، وcompN، فسيتم مقارنتها، وإذا كانت متساوية، فسيتم إرجاع iftrueN. إذا لم يتم العثور على أي تطابق في أي مجموعة من المعلمات، فإما إذا تم تحديد هذه المعلمة، أو يتم إرجاع NULL.

يمكن أن تكون كافة المعلمات الموجودة في الدالة DECODE عبارة عن تعبيرات. نوع القيمة المرجعة يساوي نوع عنصر التحقق الأول - المعلمةشركات 1. التعبير اكسبر يتم تحويل 1 ضمنيًا إلى نوع بيانات معلمة comp1. جميع معلمات الشركات الأخرى المتاحة 1... شركات ن يتم أيضًا تحويلها ضمنيًا إلى نوع شركات 1. يعامل DECODE القيمة NULL على أنها مساوية لقيمة NULL أخرى، أي. إذا كانت قيمة expr1 NULL وcomp3 NULL وcomp2 ليست NULL، فسيتم إرجاع iftrue3. دعونا نلقي نظرة على بعض الأمثلة

الاستعلام 1: حدد فك التشفير (1234، 123، '123 مطابق') من ثنائي؛

الاستعلام 2: حدد فك التشفير (1234، 123، '123 مطابق'، 'لا يوجد تطابق') من ثنائي؛

الاستعلام 3: حدد فك التشفير ('search'، 'comp1'، 'true1'، 'comp2'، 'true2'، 'search'، 'true3'، substr('2search'، 2، 6)، 'true4'، ' false') من ثنائي؛

يقارن الاستعلام الأول بين القيمة 1234 و123. وبما أنهما غير متساويتين، فسيتم تجاهل iftrue1 وبما أن القيمة iffalse لم يتم تعريفها، فسيتم إرجاع NULL. الطلب الثاني مطابق للطلب 1 فيما عدا أنه تم تحديد القيمة iffalse. بما أن 1234 لا يساوي 123، فإنها تُرجع قيمة غير صحيحة - "لا يوجد تطابق". يقوم الاستعلام الثالث بالتحقق من قيم المعلمات لمطابقة قيمة البحث. المعلمات comp1 وcomp2 لا تساوي "بحث" لذلك يتم تخطي نتائج iftrue1 وiftrue2. تم العثور على تطابق في عملية المقارنة الثالثة للعنصر comp3 (موضع المعلمة 6) وتم إرجاع قيمة iftrue3 (المعلمة 7) والتي تساوي 'true3'. منذ العثور على تطابق، لم يتم إجراء أي حسابات أخرى. أي أنه على الرغم من أن قيمة comp4 (المعلمة 8) تتطابق أيضًا مع expr1، إلا أنه لم يتم حساب هذا التعبير أبدًا حيث تم العثور على التطابق في المقارنة السابقة.

تعبير الحالة

تنفذ جميع لغات البرمجة من الجيل الثالث والرابع بناء الحالة. مثل الدالة DECODE، يسمح لك تعبير CASE بتنفيذ منطق if-then-else. هناك خياران لاستخدام تعبير CASE. يقوم تعبير CASE البسيط بإعداد العنصر المصدر للمقارنة مرة واحدة ثم يسرد جميع شروط الاختبار الضرورية. تقوم حالة معقدة (يتم البحث عنها) بتقييم كلا العبارتين لكل حالة.

يحتوي تعبير CASE على ثلاث معلمات مطلوبة. يعتمد بناء جملة التعبير على النوع. للحصول على تعبير حالة بسيط يبدو مثل هذا

حالة البحث_expr

عند المقارنة_expr1 ثم iftrue1

)

ترجع الدالة TRUNC الرقم n، مقطوعًا إلى منازل عشرية m. قد لا يتم تحديد المعلمة m؛ وفي هذه الحالة، يتم اقتطاع n إلى عدد صحيح.

حدد TRUNC(100.25678) X1، TRUNC(-100.25678) X2، TRUNC(100.99) X3،

ترونك(100.25678, 2)X4

من المزدوج

علامة الوظيفة (ن)

تحدد الدالة SIGN علامة الرقم. إذا كانت n موجبة، فإن الدالة ترجع 1. وإذا كانت n سالبة، فإنها ترجع -1. إذا كانت تساوي الصفر، فسيتم إرجاع 0 على سبيل المثال:

حدد الإشارة (100.22) X1، الإشارة (-100.22) X2، الإشارة (0) X3

من المزدوج

الميزة المثيرة للاهتمام لهذه الوظيفة هي القدرة على إرسال m يساوي صفر دون التسبب في خطأ القسمة على 0.

وظيفة الطاقة (ن، م)

تقوم الدالة POWER برفع الرقم n إلى الأس m. يمكن أن تكون الدرجة كسرية وسلبية، مما يوسع بشكل كبير قدرات هذه الوظيفة.

حدد الطاقة (10، 2) X1، الطاقة (100، 1/2) X2،

الطاقة (1000، 1/3) X3، الطاقة (1000، -1/3) X4

من المزدوج

X1 X2 X3 X4
100 10 10 0,1

في بعض الحالات، قد يحدث استثناء عند استدعاء هذه الوظيفة. على سبيل المثال:

حدد الطاقة (-100، 1/2) X2

من المزدوج

في هذه الحالة، تتم محاولة لحساب الجذر التربيعي لعدد سالب، مما سيؤدي إلى ظهور خطأ ORA-01428 "الوسيطة خارج النطاق".

الدالة SQRT(ن)

ترجع هذه الدالة الجذر التربيعي للرقم n. على سبيل المثال:

حدد SQRT(100)X

من المزدوج

وظائف EXP(n) وLN(n).

تقوم الدالة EXP برفع e إلى الأس n، وتقوم الدالة LN بحساب اللوغاريتم الطبيعي لـ n (يجب أن يكون n أكبر من الصفر). مثال:

حدد EXP(2) X1، LN(1) X2، LN(EXP(2)) X3