حالة SQL المعاملات على طول متغير Input_expression
سؤال
لا بد لي من إنتاج تقرير مخصص عن عدد المعاملات المصنوعة من أنواع بطاقات الائتمان المختلفة. لأغراض التقرير، من الجيد افتراض أن جميع بطاقات الائتمان التي تبدأ ب 4 بطاقات التأشيرة وأن تلك التي تبدأ ب 5 هي MasterCard.
هذا الاستعلام يعمل بشكل جيد للتمييز أعلاه:
select card_type =
case substring(pan,1,1)
when '4' then 'VISA'
when '5' then 'MasterCard'
else 'unknown'
end,count(*),
sum(amount)
from transactions
group by card_type
ولكن في وضعنا (غير متأكد من كيفية عمل هذا العالم على نطاق واسع) يمكن اعتبار جميع البطاقات التي تبدأ ب 3 بطاقات Diners Club إلا لأولئك الذين يبدأون ب 37 والتي هي بطاقات AMEX.
تمديد الاستعلام أعلاه مثل هذا يبدو وكأنه اختراق كامل
select card_type =
case substring(pan,1,2)
when '30' then 'Diners'
...
when '37' then 'AMEX'
...
when '39' then 'Diners'
when '40' then 'VISA'
...
when '49' then 'VISA'
when '50' then 'MasterCard'
...
when '59' then 'MasterCard'
else 'unknown'
end,count(*),
sum(amount)
from transactions
group by card_type
هل هناك طريقة أنيقة للتجميع حسب الرقم الأول في جميع الحالات إلا أين تطابق أول رقمين من القضية الخاصة؟
ليس لدي أيضا أي فكرة عن كيفية لقب هذا السؤال إذا كان أي شخص يريد مساعدة ...
تعديل: كان لدي قيم ماستركارد وفيزا مختلطة، لذلك فقط أن أكون صحيحا :)
المحلول
يمكنك القيام ببيانات الحالة مثل ما يلي:
select case
when substring(pan,1,2) = '37' then 'AMEX'
when substring(pan,1,1) = '3' then 'Diners'
when substring(pan,1,1) = '4' then 'Mastercard'
when substring(pan,1,1) = '5' then 'VISA'
else 'unknown'
end,
count(*),
sum(amount)
from transactions
group by card_type
نصائح أخرى
لست متأكدا من نظامك، ولكن في تعبيرات Oracle Case هي بالضبط، حتى تتمكن من تداها:
case substring(pan,1,1)
when '3' then case substring(pan,2,1)
when '7' then 'Amex'
else 'Diners'
end
when '4' then 'VISA'
when '5' then 'MasterCard'
else 'unknown'
end
يمكنك فقط تخزين عمود نوع البطاقة في طاولتك و FK إلى جدول نوع البطاقة، أو جرب شيئا مثل:
CASE
WHEN LEFT(pan,2)='37' then ...
WHEN LEFT(pan,1)='3' then ...
.....
تعديل
يجب عليك حقا التفكير في تخزين قيمة نوع البطاقة في جدول. حددها مرة واحدة عند إدراجها ثم بعد ذلك يمكنك الاستعلام عن بياناتك دون القفز عبر هذه الأطواق في كل مرة. ستحمي نفسك أيضا إذا تغيرت الخوارزمية في مرحلة ما، ستكون جميع البيانات الموجودة صحيحة
شخصيا، أعتقد أن طريقك "طويل" هو أنيق أنه من السهل القراءة والصيانة مما كنت سأجد إجابة Samjudson (لكنني أرى نداء نهجهم). يمكنك استخدام OR
لاختبار أكثر من قيمة واحدة لكل حالة. وجدت LIKE
أسهل في القراءة ولكن هذا قد يكون لي فقط؛) على سبيل المثال
CASE
WHEN card_type LIKE '37%'
THEN 'AMEX'
WHEN (
card_type LIKE '30%'
OR card_type LIKE '39%'
)
THEN 'Diners'
WHEN (
card_type LIKE '40%'
OR card_type LIKE '49%'
)
THEN 'VISA'
WHEN (
card_type LIKE '50%'
OR card_type LIKE '59%'
)
THEN 'MasterCard'
ELSE
'unknown'
END