দুটি কলাম একটি সেটে রয়েছে তা নির্বাচন করা হচ্ছে


35

এটি একটি নির্বোধ প্রশ্ন হতে পারে এবং আমার সন্দেহ হ'ল আমি এটি করতে পারি না তবে এসকিউএল-তে এমন একটি গঠন রয়েছে যা আমাকে নীচের মতো কিছু করার অনুমতি দেয়:

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)

আমি ডেটা নির্বাচন করতে চাই যেখানে দুটি কলাম জোড়া জোলে সেট।

যদি সম্ভব হয় তবে আমি সাবকিউরি ব্যবহার করা এড়াতে চাই।

উত্তর:


49

এসকিউএল-তে এমন কোনও নির্মাণ রয়েছে যা আমাকে নীচের মতো কিছু করার অনুমতি দেবে:

হ্যাঁ, আপনি যেমন লিখেছিলেন ঠিক তেমনই রয়েছে। শুধু করা col1, col2প্রথম বন্ধনী ভিতরে:

-- works in PostgreSQL, Oracle, MySQL, DB2, HSQLDB 
SELECT whatever 
FROM t                               --- you missed the FROM
WHERE (col1, col2)                    --- parentheses here
       IN ((val1a, val2a), (val1b, val2b), ...) ;

আপনি যদি এটি ডিবিএমএস-এ চেষ্টা করে থাকেন তবে দেখতে পাবেন এটি কার্যকর হয়নি। কারণ সমস্ত ডিবিএমএস (বিবর্তিত) এসকিউএল স্ট্যান্ডার্ডের সমস্ত বৈশিষ্ট্য বাস্তবায়ন করে না। এটি ওরাকল, মাইএসকিউএল, পোস্টগ্রিস, ডিবি 2 এবং এইচএসকিউএলডিবির সর্বশেষতম সংস্করণগুলিতে কাজ করে (এটি মাইএসকিউএলে ভালভাবে অনুকূলিত হয়নি এবং সূচকগুলি ব্যবহার করে না, সুতরাং তারা এটিকে 5.7 এ স্থির না করা হলে সেখানে এড়ানো উচিত)।

INঅপারেটর সম্পর্কে মাইএসকিউএল ডকুমেন্টেশন এবং সারি নির্মাণকারী সম্পর্কে পোস্টগ্রিস ডকুমেন্টেশন দেখুন । প্রথম বন্ধনীতে দুটি * (বা আরও বেশি) মানকে একটি সারি- নির্মাতা বলা হয় ।

অন্যান্য ধারণা যা একই ধারণা প্রকাশ করে:

-- works in PostgreSQL, DB2
SELECT whatever 
FROM t 
WHERE (col1, col2) 
       IN ( VALUES (val1a, val2a), (val1b, val2b), ...) ;

SELECT t.whatever 
FROM t 
  JOIN 
    ( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
      ON (x.col1, x.col2) = (t.col1, t.col2) ;

দুজনেই পোস্টগ্র্রেস এবং ডিবি 2 (আফাইক) এ কাজ করে। শেষটি এসকিউএল সার্ভারে কাজ করার জন্যও পরিবর্তন করা যেতে পারে:

-- works in PostgreSQL, DB2, SQL Server
SELECT t.whatever 
FROM t 
  JOIN 
    ( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
      ON  x.col1 = t.col1
      AND x.col2 = t.col2 ;

মানগুলি প্রথমে (অস্থায়ী বা স্থায়ী) টেবিলের মধ্যে রেখে, সর্বত্র কাজ করার জন্য এটি পরিবর্তন করা যেতে পারে:

-- works everywhere
CREATE TABLE values_x
( col1  ...,
  col2  ...) ;

-- use appropriate for the DBMS syntax here
INSERT INTO values_x (col1, col2)
VALUES (val1a, val2a), (val1b, val2b), ... ;

SELECT t.whatever 
FROM t 
  JOIN values_x  x 
      ON  x.col1 = t.col1
      AND x.col2 = t.col2 ;

DROP TABLE values_x ;

এবং সর্বদা দীর্ঘ পথ বা INদীর্ঘ অভিব্যক্তিতে রূপান্তরকরণ এর সাথে ORসর্বত্র কাজ করা উচিত:

-- works in all SQL DBMS
SELECT whatever 
FROM t  
WHERE col1 = val1a AND col2 = val2a
   OR col1 = val1b AND col2 = val2b
   ---
   ;

*: ROW(v)পোস্টগ্র্রেস ডক্স সহ এটি কেবলমাত্র একটি মান হতে পারে ।


আমি কোথায় ডকুমেন্টেশন সন্ধান করতে পারি WHERE (x, y) IN (a,b)? আমি মাইএসকিএল ব্যবহার করছি। সম্ভবত আমি জানি না এই নির্মাণটি কী বলা হয় is
রবার্ট রোচা

1
@ রবার্টরোচা আমি যুক্ত লিঙ্কগুলি দেখুন। একে সারি IN
নির্মাতা

এছাড়াও আছে WHERE EXISTS (SELECT t.col1, t.col2 [FROM DUAL] INTERSECT VALUES(val1, val2), (…, …), …)
অ্যান্ড্রি এম

-4
SELECT * 
FROM   dbo.Table1 A
WHERE  (CAST(Column1 AS VARCHAR(max)) + '-' + CAST(Column2 AS varchar(max)))
NOT IN (SELECT (CAST(Column1 AS VARCHAR(max)) 
                + '-' 
                + CAST(Column2 AS varchar(max))) 
        FROM Table2)

2
এটি নির্ভরযোগ্যভাবে কাজ করবে না
a_horse_with_no_name

2
হ্যাঁ। অদক্ষতা ছাড়াও, এটি 'a-b', 'c'এবং এর মধ্যে পার্থক্য করতে সক্ষম হবে না 'a', 'b-c'। এবং রূপান্তরিত করা যায় না এমন কোনও ধরণের ক্ষেত্রে এটি খারাপভাবে ব্যর্থ হবে varchar(max)
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.