কীভাবে দুই বা ততোধিক কলামের শর্তাধীন অর্ডারিং করা যায়


10

এমএস এসকিউএল সার্ভার ২০০ 2005-এ আমি শর্তসাপেক্ষে একটি জিজ্ঞাসা লিখছি এবং আমার সমস্যাটি হ'ল আমি জানি না যে আমি কীভাবে দুটি কলাম ব্যবহার করে শর্তযুক্ত বাছাই করতে পারি?

আমি যদি কোডটি লিখি তবে এটি স্বাভাবিকভাবে কাজ করছে

select
    *
from 
    table
order by 
    case @pkr 
           when 'kol' then kol
           when 'nci' then nci
    end

আমি জানি না কীভাবে দুই বা ততোধিক কলামের জন্য শর্তসাপেক্ষে অর্ডারিং করা যায়

select
    *
from 
    table
order by 
    case @pkr
        when 'KOL-NCI' then kol,nci
        when 'kol-MPCI' then kol,mpci
    end

গতিশীল টিএসকিউএল তৈরি এবং ব্যবহার করার একটি ধারণা আছে sp_executesqlতবে আমি এখনও আরও ভাল ধারণা খুঁজছি?



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

উত্তর:


12

আমি স্বীকার করব যে এর আগে আমাকে কখনও এটি করতে হয়নি তাই এতে মাথা আঁচড়ানোর বিষয়টি জড়িত ছিল। প্রদর্শনের জন্য সাধারণ উদাহরণ সারণী:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
    DROP TABLE [dbo].[MyTable]
GO

CREATE TABLE dbo.MyTable
(
    col1 INT
    , col2 CHAR(1)
)
GO

INSERT dbo.MyTable (col1, col2) VALUES (1, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'C')

বাছাই আদেশের মধ্যে পার্থক্য করতে একটি @ সোর্টসাইল স্টাইল প্যারামিটার ব্যবহার করে, col1 ASC, col2 DESC@ সোর্টসটিল = 1 বাছাই করে এবং @ সাজ্ট স্টাইল = 2 সাজান অনুসারে col2 DESC, col1 ASC

DECLARE @SortStyle INT
SET @SortStyle = 1

SELECT
    col1
    , col2
FROM
    dbo.MyTable
ORDER BY
    CASE
        WHEN @SortStyle = 1 THEN col1
    END ASC,
    CASE
        WHEN @SortStyle = 1 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col1
    END ASC

SET @SortStyle = 2

SELECT
    col1
    , col2
FROM
    dbo.MyTable
ORDER BY
    CASE
        WHEN @SortStyle = 1 THEN col1
    END ASC,
    CASE
        WHEN @SortStyle = 1 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col1
    END ASC

আপনি কীভাবে কোনও প্যারামিটার অর্ডার করেন মাত্র 1 কলাম দ্বারা বাছাইয়ের সরল কেসটিকে covers েকে দেয়


5

ধরে নিলাম আপনার আরও মামলা রয়েছে (আমি একটি যুক্ত করেছি), এবং সমস্ত প্রকারের সাথে সামঞ্জস্যপূর্ণ,

order by 
    case @pkr
        when 'KOL-NCI' then kol
        when 'kol-MPCI' then kol
        when 'foo-bar' then foo
    end,
    case @pkr
        when 'KOL-NCI' then nci
        when 'kol-MPCI' then mpci
        when 'foo-bar' then bar 
    end

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


1

উদাহরণ হিসাবে আপনি এটি সহজ:

select *
from table
order by kol, case @pkr
                when 'KOL-NCI' then nci
                when 'kol-MPCI' then mpci
              end

গতিশীল টিএসকিউএল তৈরি এবং ব্যবহার করার একটি ধারণা রয়েছে sp_executesqlতবে আমি আরও ভাল ধারণার জন্য অপেক্ষা করছি।

এটি সম্ভব যেখানে ডায়নামিক এসকিউএল এড়ানো সর্বদা দুর্দান্ত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.