سؤال

أقوم بمقارنة بعض بيانات CHAR في عبارة حيث في SQL الخاصة بي مثل هذا،

حيث PRI_CODE <PriCode

المشكلة التي أواجهها هي عندما تكون قيم CHAR ذات أطوال مختلفة.لذا، إذا كان PRI_CODE = '0800' وPriCode = '20'، فسيتم إرجاعه صحيحًا بدلاً من خطأ.

يبدو أنه يقارنه بهذه الطريقة

'08' < '20' 

بدلا من مثل

'0800' < '20'

هل تبدأ مقارنة CHAR من اليسار حتى تنتهي إحدى القيم أو القيم الأخرى؟

إذا كان الأمر كذلك كيف يمكنني إصلاح هذا؟

يمكن أن تحتوي القيم الخاصة بي على أحرف، لذا فإن التحويل إلى الأرقام ليس خيارًا.

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

المحلول

إنها لا تقارن "08" بـ "20"، بل هي، كما تتوقع، مقارنة "0800" بـ "20".

لكن ما لا يبدو أنك تتوقعه هو أن "0800" (السلسلة). بالفعل أقل من "20" (السلسلة).

إذا كان تحويلها إلى أرقام للمقارنة الرقمية غير وارد، فيمكنك استخدام وظيفة DB2 التالية:

right ('0000000000'||val,10)

والتي سوف تعطيك val مبطن على اليسار بأصفار بحجم 10 (مثالي لـ CHAR(10), ، على سبيل المثال).سيضمن ذلك على الأقل أن تكون الحقول بنفس الحجم وأن المقارنة ستعمل مع حالتك الخاصة.لكنني أحثك ​​على إعادة التفكير في كيفية قيامك بالأشياء:نادرًا ما يتم قياس الوظائف لكل صف بشكل جيد من حيث الأداء.

إذا كنت تستخدم z/OS، فمن المفترض أن يكون لديك عدد قليل من مسؤولي قواعد البيانات مستلقين على أرضية غرفة الكمبيوتر في انتظار العمل - ربما يمكنك أن تطلب من أحدهم نصيحة أكثر ملاءمة لتطبيقك المحدد :-)

أحد الأشياء التي تتبادر إلى الذهن عند استخدام مشغل الإدراج/التحديث والعمود الثانوي PRI_CODE_PADDED لعقد PRI_CODE العمود مبطن بالكامل (باستخدام نفس الطريقة المذكورة أعلاه).ثم تأكد من الخاص بك PriCode يتم تنسيق المتغير بالمثل قبل تنفيذ الملف select ... where PR_CODE_PADDED < PriCode.

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

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