একাধিক ক্যোয়ারী কলামগুলির জন্য যখন একই শর্ত থাকে তখন ব্যবহার করুন


12

শর্তগুলি কেবল একবার একবার পরীক্ষা করা হয়েছে SELECTএমন একাধিক কলাম একই CASE WHENশর্ত ব্যবহার করে এমন ধারাটির পুনর্লিখনের জন্য কি "আরও ভাল" উপায় আছে ?

নীচে উদাহরণ দেখুন।

SELECT
    CASE testStatus 
        WHEN 'A' THEN 'Authorized'
        WHEN 'C' THEN 'Completed'
        WHEN 'P' THEN 'In Progress'
        WHEN 'X' THEN 'Cancelled'
    END AS Status,

    CASE testStatus 
        WHEN 'A' THEN authTime
        WHEN 'C' THEN cmplTime
        WHEN 'P' THEN strtTime
        WHEN 'X' THEN cancTime
    END AS lastEventTime,

    CASE testStatus 
        WHEN 'A' THEN authBy
        WHEN 'C' THEN cmplBy
        WHEN 'P' THEN strtBy
        WHEN 'X' THEN cancBy
    END AS lastEventUser
FROM test

নন-এসকিএল সিউজিডো-কোডে, কোডটি দেখতে দেখতে এমন হতে পারে:

CASE testStatus
    WHEN 'A'
        StatusCol        = 'Authorized'
        lastEventTimeCol = authTime 
        lastEventUserCol = authUser
    WHEN 'C'
        StatusCol        = 'Completed'
        lastEventTimeCol = cmplTime
        lastEventUserCol = cmplUser
    ...
END

বিঃদ্রঃ:

  • আমি ক্যোয়ারী দ্বারা সূচিত সুস্পষ্ট স্বাভাবিকীকরণ বিষয়গুলি সম্পর্কে সচেতন। আমি কেবল ইস্যুটি প্রদর্শন করতে চেয়েছিলাম।

এবং এই সব কলাম authTime, authUser, cmplTimeএকই টেবিল আছে?
ypercubeᵀᴹ

অনুরূপ প্রশ্ন: stackoverflow.com/q/13713316/4632019
ইউজেন কনকভ

উত্তর:


7

এমনকি ওরাকলে (এবং বাস্তবে এসকিউএল স্ট্যান্ডার্ডে), CASEএটি একটি অভিব্যক্তি যা একক মান ফেরায়। এটি অন্য কয়েকটি ভাষায় যেমন প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয় না । অতএব, একাধিক কলাম বা অন্যান্য ক্রিয়াকলাপগুলির মধ্যে শর্তাধীন সিদ্ধান্ত নিতে এটি ব্যবহার করা যাবে না।

আমি বলব কোডটির দীর্ঘতর সংস্করণ (যা ইতিমধ্যে কাজ করে) একটি ভিউতে রেখেছি এবং এটি সম্পর্কে আপনার আনুষ্ঠানিক প্রশ্নগুলিতে উদ্বিগ্ন হবেন না।

আপনি আরও একটি সাধারণ নকশা বিবেচনা করতে পারেন। উদাহরণস্বরূপ, কেন তিনি চাবি অংশ হিসাবে টাইপ সঙ্গে একটি পৃথক টেবিল বিশদ নিরীক্ষণ বিশদ সংরক্ষণ না? এটি আপনার কোড বজায় রাখা আরও সহজ করে তোলে, বিশেষত আরও বেশি প্রকার যুক্ত হওয়ার সাথে ...


Even in Oracle... তবে পোস্টগ্রিসে যা সংমিশ্রিত প্রকারের প্রসারিত করে সম্ভব।
ইউজেন কনকভ

7

যদি এই সমস্ত কলামগুলি একই টেবিল থেকে হয়, আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

    SELECT  
        'Authorized' AS StatusCol,
        authTime     AS lastEventTimeCol, 
        authUser     AS lastEventUserCol 
    FROM test
    WHERE testStatus = 'A'

  UNION ALL

    SELECT  
        'Completed', 
        cmplTime,
        cmplUser    
    FROM test
    WHERE testStatus = 'C'

  UNION ALL

    SELECT  
        'In Progress', 
        strtTime,
        strtUser    
    FROM test
    WHERE testStatus = 'P'

  UNION ALL

    SELECT  
        'Cancelled', 
        cancTime,
        cancUser    
    FROM test
    WHERE testStatus = 'X' ;

2
আমি এই পোস্টে চিন্তা, কিন্তু এটি ঠিক দীর্ঘ-বায়ুযুক্ত। আমি মনে করি না এটি করার একটি দুর্দান্ত উপায় আছে।
ফিলি

এটি +1 প্রশ্নের উত্তর দেয়, তবে অন্যেরা যেমন সূচিত করেছে, আপনি যা শুরু করেছেন তা আরও ভাল। আপনি প্রতিটি টেস্ট স্ট্যাটাসের সাথে মিলে এমন মানগুলিও সংবিধানিত করতে পারেন এবং তারপরে এগুলিকে আলাদা করে দিতে পারেন তবে এটি আরও খারাপ হবে।
লেইফ রিফেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.