اطلب عن طريق فك الشفرة (بلاه ، [رقم العمود]) على استعلام عمود واحد. كيف يعمل؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

مرحبًا ، أنا بحاجة إلى مساعدة لفهم جزء فك التشفير من استعلام يتناسب مع ما يلي.

SELECT ax.animal_code    
FROM  raw_animal_xref ax,
      animal_xref_type axt
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR'
AND   ax.animal_code_type = axt.animal_code_type
ORDER BY DECODE (animal_type, 
                l_type_to_be_matched, -1, -- Example 'CATS'
                l_current_type, 0, -- Example 'BIG CATS'
                nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1

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

أنا أفكر في أن Decode يعيد أرقام الأعمدة المختلفة التي تطلبها معها ، وحاولت تجربة تحديد عمود واحد بسيط بسيط على بعض الجداول الأخرى مع الطلب بواسطة "-1" و "0" و "100" والترتيب بواسطة يبدو للفشل في 0 و 100. لماذا تعمل مع -1 أو أي من الأرقام الأخرى؟

آمل أن يتمكن شخص ما من شرح هذا لي. شكرًا!

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

المحلول

يخلق المجموعة التي سيتم استخدامها للطلب.

إذا كان animal_type = l_type_to_be_matched ، استخدم -1 كقيمة الفرز لهذا الصف
وإلا
آخر إذا كان axt.type_search_priority فارغًا ، فاستخدم 100 كقيمة فرز لهذا الصف
هل استخدم AXT.Type_Search_Priority كقيمة الفرز لهذا الصف.

انه يعطي نوعا من cirteria من النوع الشرطي. غالبًا ما تستخدم لضمان أن تكون بعض العناصر دائمًا في أعلى أو أسفل مجموعة مصنفة.

نصائح أخرى

يمكن للترتيب استخدام أحد التعبيرات الثلاثة. أولاً ، اسم مستعار لقائمة التحديد ، ثانياً عدد العمود في قائمة التحديد أو ثالث تعبير SQL الذي قد يستخدم صفر أو أكثر من أعمدة من الجداول المصدر.

لذلك عند استخدام الطلب بواسطة Sentstr (Col ، 2،10) تقوم بطلبها بواسطة 10 أحرف من قيمة العمود بدءًا من الحرف الثاني.

وبالمثل عند الاستخدام

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)

يمكنك ترجمة الكلب إلى القيمة 1 ، CAT إلى القيمة 2 ، EEL إلى القيمة 3 وغيرها إلى قيمة 5. ثم اطلب القيمة الرقمية الناتجة (أي الكلب أولاً ، ثم CAT ، ثم ثعبان البحر ، أخيرًا أي شيء آخر).

يمكنك تحقيق نفس الترتيب باستخدام

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')

في إشارة إلى هذا الجزء من سؤالك:

أنا أفكر في أن Decode يعيد أرقام الأعمدة المختلفة التي تطلبها معها ، وحاولت تجربة تحديد عمود واحد بسيط بسيط على بعض الجداول الأخرى مع الطلب بواسطة "-1" و "0" و "100" والترتيب بواسطة يبدو للفشل في 0 و 100. لماذا تعمل مع -1 أو أي من الأرقام الأخرى؟

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

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

SELECT a, b FROM some_table ORDER BY 1,2

بالضبط مثل:

SELECT a, b FROM some_table ORDER BY a,b

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

SELECT * FROM table ORDER BY -1 سيتم فرز جميع الصفوف على القيمة الثابتة -1 (بفعالية لا يوجد فرز).

SELECT * FROM table ORDER BY 0 سيعود خطأ لأن 0 هو رقم عمود غير صالح.

SELECT * FROM table ORDER BY 1 سيتم فرز جميع الصفوف على قيمة العمود الأول في الجدول.

SELECT * FROM table ORDER BY 100 سيتم فرز جميع الصفوف على قيمة العمود 100 في الجدول ، أو إرجاع خطأ إذا كان هناك أقل من 100 عمود.

SELECT * FROM table ORDER BY TO_NUMBER('1') سيتم فرز جميع الصفوف على القيمة الثابتة 1.

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

SELECT * FROM table ORDER BY 1.5 يبدو لفرز قيمة العمود الأول.

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