এসকিউএল সার্ভারে মান তালিকা থেকে আমি কীভাবে নির্বাচন করতে পারি


216

আমার খুব সাধারণ সমস্যা আছে যা আমি সমাধান করতে পারি না। আমাকে এরকম কিছু করতে হবে:

select distinct * from (1, 1, 1, 2, 5, 1, 6).

কেউ সাহায্য করতে পারেন ??

সম্পাদন করা

আমাদের ক্লায়েন্টগুলির একটি থেকে ডেটা একটি টেক্সট ফাইল হিসাবে আসে। এটি সম্পূর্ণরূপে ফর্ম্যাট করা হয়নি (এটি পাঠ্যের একক, খুব দীর্ঘ লাইন) তবে এক্সেলে এটি করা সম্ভব হতে পারে। তবে এটি আমার পক্ষে ব্যবহারিক নয়, কারণ আমার এসএলএল কোয়েরিতে আমাকে এই মানগুলি ব্যবহার করতে হবে। আমার যখনই কোনও ক্যুরি চালানোর দরকার হয় তখন এটি করা সুবিধাজনক নয়।


আপনি কি একাধিক টেবিল থেকে নির্বাচন করতে চান বা একটি একক টেবিল থেকে নির্বাচন করতে চান তবে একটি নির্দিষ্ট মান নির্বাচন করতে চান? নির্দিষ্ট আইডির মতো কিছু জিনিস
অনিরুদ্ধ গোয়েল

আপনি যা চান তা নয়, তবে আপনি এটি অন্য ভাষায় করতে পারেন। পাওয়ারশেলের উদাহরণস্বরূপ, আপনি $d = (1, 1, 1, 2, 5, 1, 6) | sort -Uniqueঅ্যারেতে পৃথক মান পেতে পারেন $d। একটি ফাইল-থেকে-ফাইল সরঞ্জামে প্রসারিত করা সহজ।
জেপ্প স্টিগ

Values ​​মানগুলির একটি স্বতন্ত্র তালিকা পেতে, বা এসকিউএল-র মানগুলির তালিকাটি পেতে এখানে গুরুত্বপূর্ণ জিনিসটি কী? @ জেপ্পস্টিগনিয়েলসন যেমন বলেছেন, এসকিউএল জড়িত না এমন একটি পাঠ্য তালিকা থেকে স্বতন্ত্র মান পাওয়ার অন্যান্য উপায়ও রয়েছে। আমি এখানে এসকিউএল স্ক্রিপ্টে মানগুলির একটি তালিকা পেতে পারি যা অন্য সারণিগুলির উল্লেখ করে।
রিককি

উত্তর:


81

কমা সীমান্তযুক্ত পাঠ্যের দীর্ঘ তালিকার স্বতন্ত্র মানগুলি পাওয়ার সহজ উপায় হ'ল স্বতন্ত্র মানগুলি অর্জনের জন্য ইউএনআইএন দ্বারা প্রতিস্থাপনের সন্ধান করা ।

SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
UNION SELECT 1
UNION SELECT 6

আপনার কমা সীমানা পাঠ্যের দীর্ঘ লাইনে প্রয়োগ হয়েছে

  • প্রতিটি কমাটি এর সাথে সন্ধান করুন এবং প্রতিস্থাপন করুন UNION SELECT
  • SELECTবিবৃতিটির সামনে একটি যুক্ত করুন

আপনার এখন একটি কার্যকারী জিজ্ঞাসা থাকা উচিত


3
না, না, আমার কয়েক শতাধিক মানের একটি তালিকা রয়েছে, ম্যানুয়ালি এটি নির্যাতন হবে
এদোহ

এই তালিকাটি কোথা থেকে আসে? এক্সেলটিতে কেবল সেই তালিকাটি অনুলিপি / আটকানো এবং একটি সাধারণ ক্রসস্ট্যাব ব্যবহার করে সেখানে স্বতন্ত্র মানগুলি বের করা সহজতর উপায় হতে পারে।
লিভেন কের্মসেকার্স

বিটিডব্লিউ, সন্ধান এবং প্রতিস্থাপন আপনাকে অনেক দীর্ঘ পথ যেতে পারে। ইউনিয়ন নির্বাচনের সাথে প্রতিটি কমা প্রতিস্থাপন করুন , সামনে একটি নির্বাচন যুক্ত করুন এবং আপনার ইউনিয়ন সিএফআর দ্বারা একটি ওয়ার্কিং কোয়েরি থাকা উচিত I
লিভেন কের্মসেকার্স

1
নির্বাচিত ইউনিয়নের সাথে কমাগুলি প্রতিস্থাপনের সাথে এই
স্টাফটি কবজির

5
পারফরম্যান্সের কারণে, আমি ইউনিয়ন-অলকে সুপারিশ করব, তারপরে গ্রুপ-বাই বা আপনার বাহ্যিক নির্বাচনের ক্ষেত্রে পৃথক ব্যবহার করব।
মাইকটাইভি

427

কেবলমাত্র এসকিউএল সার্ভার ২০০৮ এ উপলব্ধ এবং এই ফর্মটিতে সারি-নির্মাণকারী রয়েছে:
আপনি ব্যবহার করতে পারেন

SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)

তাদের মধ্যে অনেকে লিখেছেন:


66
পার্শ্ব-নোট: Xসারণির নামের aজন্য উপনাম এবং কলামের নামের জন্য উপনাম;)।
shA.t

11
এটি বর্তমানে নির্বাচিত একটির তুলনায় এটি আরও সঠিক উত্তর
ট্যাবসনটস্পেসেস

1
এটি সর্বাধিক জেনেরিক উপায়, আমি অজানা (আরআরএ []) দ্বারা নষ্ট হয়েছি pgsqlএবং এখন এফআরওএমকে সারি রেকর্ড হিসাবে গৌণ মানগুলি স্বীকার করার জন্য মাথা ঠেকিয়েছি sqlserverএবং এটি এখানে it জেনে খুশি।
বেন

1
কলাম এবং টেবিল উপন্যাসের কারণে আরও ভাল উত্তর
আলফ্রেডো এ।

79

সাধারণভাবে:

SELECT 
  DISTINCT 
      FieldName1, FieldName2, ..., FieldNameN
FROM
  (
    Values
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN )
  ) AS TempTableName ( FieldName1, FieldName2, ..., FieldNameN )

তোমার ক্ষেত্রে :

Select 
  distinct
  TempTableName.Field1 
From 
  (
  VALUES
    (1), 
    (1), 
    (1), 
    (2), 
    (5), 
    (1), 
    (6)
  ) AS TempTableName (Field1)

1
আমি জানি "নির্বাচন *" কে খারাপ ফর্ম হিসাবে বিবেচনা করা হয়, তবে এই ক্ষেত্রে নির্বাচন * ব্যবহার না করার কোনও কারণ আছে কি? FieldName1, FieldName2, ..., FieldNameN এর সদৃশটি হতাশাজনক।
Pxtl

@Pxtl "নির্বাচন করুন *" ব্যবহার না করার কোনও কারণ নেই। আরও স্পষ্ট হওয়ার জন্য আমি সেই ক্ষেত্রের নামগুলি আবার লিখেছি। এছাড়াও, আপনার সম্ভবত "বিচ্ছিন্ন" কীওয়ার্ডের প্রয়োজন হবে না।
আর্দলান শাহঘোলি

43

আপনি কি নিম্নলিখিত সিনট্যাক্স ব্যবহার করে চেষ্টা করেছেন?

select * from (values (1), (2), (3), (4), (5)) numbers(number)

5
একজন অনামী ব্যবহারকারী কোডটি সম্পাদনা করার পরামর্শ দিয়েছেন:SELECT DISTINCT table_name.column_name FROM (VALUES (1), (2), (3)) AS table_name(column_name)
Vogel612

19

আপনি যদি একটি একক টেবিল থেকে কেবলমাত্র কয়েকটি মান নির্বাচন করতে চান তবে আপনি এটি চেষ্টা করতে পারেন

select distinct(*) from table_name where table_field in (1,1,2,3,4,5)

উদাহরণ:

select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)

আপনি যদি একাধিক টেবিল থেকে নির্বাচন করতে চান তবে আপনাকে অবশ্যই যেতে হবে UNION

আপনি যদি কেবল 1, 1, 1, 2, 5, 1, 6 মানগুলি নির্বাচন করতে চান তবে আপনাকে অবশ্যই এটি করতে হবে

select 1 
union select 1 
union select 1 
union select 2 
union select 5 
union select 1 
union select 6

1
আমার কোনও টেবিল থেকে নির্বাচন করার দরকার নেই, তবে মানগুলির তালিকা থেকে (বন্ধনীগুলিতে)। এটিই মূল সমস্যা (কোনও টেবিল থেকে নয়, কমা দ্বারা পৃথক হওয়া মূল্যের অ্যারে থেকে নির্বাচন করা)
এদোহ

সেই ক্ষেত্রে, যেমন ওরাকলে আমাদের ডুয়াল টেবিল রয়েছে, আপনি একই ব্যবহার করতে পারেন। তবে যেহেতু কোনও ডুয়াল নেই তখন আপনাকে ইউনিয়নের পথে যেতে হবে। আপনি অন্য একটি পদ্ধতিতে চেষ্টা করতে পারেন, যেমন আপনি উল্লেখ করেছেন যে আপনি কমাগুলি পৃথক করে মানগুলি রেখেছেন, কেন আপনি সেগুলি একটি টেবিলের মধ্যে sertোকান না এবং তারপরে এতগুলি এসকিএল ইউনিয়ন ব্যবহার না করে একটি ঝরঝরে স্ক্যাকল সিলেক্ট ক্যোয়ারী ব্যবহার করুন।
অনিরুদ্ধ গোয়েল

14

পোস্টগ্র্যাস এসকিউএল আপনাকে এটি করার 2 টি উপায় দেয়:

SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)

অথবা

SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)

অ্যারে পদ্ধতির ব্যবহার করে আপনি এ জাতীয় কিছু করতে পারেন:

SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)

11
যদিও প্রশ্নটি :)
এমএসএসকিউএল

@ হাফলার এখানে প্রদত্ত প্রথম উত্তরটি এমএসএসকিউএল 2016 ব্যবহার করে আমার পক্ষে কাজ করেছে যখন অন্য উত্তরগুলি দেয় নি। 7 বছর পরে
9:49 এ 13

9

এটি এসকিউএল সার্ভার 2005 এ কাজ করে এবং যদি সর্বাধিক সংখ্যা থাকে:

SELECT * 
FROM
  (SELECT ROW_NUMBER() OVER(ORDER BY a.id) NUMBER
  FROM syscomments a
  CROSS JOIN syscomments b) c
WHERE c.NUMBER IN (1,4,6,7,9)

2
+1 সুস্পষ্ট তবে এটি নিজের সাথে যোগ হওয়া সিস্টেমে ক্রসের সারিগুলির পরিমাণের মধ্যে সীমাবদ্ধ। 294849. থেকে আমার ক্ষেত্রে (। এবং আপনি স্বতন্ত্র ভুলে গেছি) সালে
Lieven Keersmaekers

আপনি আরও একবার যোগ দিতে পার করতে পারেন, তবে কমাগুলি প্রতিস্থাপন করা আরও দ্রুত সমাধান।
LukLed

হ্যাঁ, এই উপায়টিও ভাল তবে সরলতার কারণে আমি লাইভেনের সমাধানটিকে পছন্দ করি।
এদোহ

3

আমি জানি এটি বেশ পুরানো থ্রেড, তবে আমি অনুরূপ কিছু সন্ধান করছি এবং এটি নিয়ে এসেছি।

আপনার কমা-বিভাজিত স্ট্রিংটি দেওয়া হয়েছে, আপনি ব্যবহার করতে পারেন string_split

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')

এই ফিরে আসা উচিত

1
2
5
6

স্ট্রিং বিভক্ত দুটি প্যারামিটার, স্ট্রিং ইনপুট এবং বিভাজক অক্ষর লাগে।

আপনি valueকমন নাম হিসাবে ব্যবহার করে একটি বিবরণ যুক্ত করতে পারেন

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
where value > 1

উত্পাদন করে

2
5
6


1
@ সাম হ্যাঁ, এটি মূল প্রশ্নটির ট্যাগগুলি অনুসারে এটি এসকিউএল সার্ভার
ন্যাপকিনোবিউল

1
@ জোনাথন হ্যাঁ, প্রশ্নের বয়স অনুসারে, এটি মূল পোস্টারটিকে সাহায্য করবে না, তবে আমি অনুভব করেছি যে আমার মতো এটির উপরে কেউ হোঁচট খেতে পারে এবং এটি সহায়ক বলে মনে করি।
ন্যাপকিনোবিজ

2

আপনার যদি অ্যারের প্রয়োজন হয় তবে কমা দিয়ে অ্যারে কলামগুলি পৃথক করুন:

SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])

0

আর একটি উপায় যা আপনি ব্যবহার করতে পারেন তা হল এই জাতীয় একটি কোয়েরি:

SELECT DISTINCT
    LTRIM(m.n.value('.[1]','varchar(8000)')) as columnName
FROM 
    (SELECT CAST('<XMLRoot><RowData>' + REPLACE(t.val,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
     FROM (SELECT '1, 1, 1, 2, 5, 1, 6') AS t(val)
    ) dt
  CROSS APPLY 
    x.nodes('/XMLRoot/RowData') m(n);

0

ব্যবহারকারী আইডির তালিকা থেকে ব্যবহারকারী আইডি নির্বাচন করুন:

SELECT * FROM my_table WHERE user_id IN (1,3,5,7,9,4);

-2

যে কৌশলটি আমার পক্ষে কাজ করেছে তা হ'ল একটি টেবিলের ক্যোয়ারী যা আপনি জানেন যে এতে আপনার প্রচুর রেকর্ড রয়েছে, কেবলমাত্র আপনার ফলাফলের সারি_ নাম্বার ক্ষেত্র সহ

Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable

1 থেকে 10000 পর্যন্ত 10000 রেকর্ডের একটি ফলাফল সেট ফিরে আসবে, আপনাকে পছন্দসই ফলাফল দেওয়ার জন্য অন্য কোয়েরির মধ্যে এটি ব্যবহার করুন


-4

এসকিউএল Inফাংশনটি ব্যবহার করুন

এটার মতো কিছু:

SELECT * FROM mytable WHERE:
"VALUE" In (1,2,3,7,90,500)

আর্কজিআইএসে একটি ট্রিট কাজ করে


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