আমি কি একটি বাম বাইরের যোগদানের জন্য একটি ডিফল্ট সরবরাহ করতে পারি?


21

ধরুন আমার কাছে টেবিলগুলি একটি (কলাম এ 1 সহ) এবং বি (কলাম বি 1 এবং বি 2 সহ) আছে এবং আমি একটি বাম বাহ্যিক জোড় সম্পাদন করব

SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1

তারপরে বি 1 এবং বি 2 হবে NULL যেখানে a1 এর মান বি 1 এর কোনও মিল নেই।

আমি কি নুলের পরিবর্তে বি 2 এর জন্য একটি ডিফল্ট মান সরবরাহ করতে পারি? লক্ষ্য করুন একসঙ্গে বেড়ে ওঠা এখানে কাজ করবে না, কারণ আমি না ডিফল্ট মান B2 সম্ভাব্য NULLs মানের ওভাররাইড করতে যেখানে চান হয় B1 ম্যাচিং A1 একটি মান।

যে, একটি এবং খ হিসাবে

CREATE TABLE a (a1)
  AS VALUES (1),
            (2),
            (3) ;

CREATE TABLE b (b1,b2)
  AS VALUES (1, 10),
            (3, null) ;


a1     b1 | b2
---    --------
 1      1 | 10
 2      3 | NULL
 3

এবং 100 এর বি 2 এর জন্য একটি ডিফল্ট, আমি ফলাফলটি পেতে চাই

a1 | b1   | b2
---------------
1  |  1   | 10
2  | NULL | 100
3  |  3   | NULL

এই সাধারণ ক্ষেত্রে আমি "হাত দ্বারা" এটি করতে পারলাম আউটপুটে বি 1 NULL কিনা তা দেখে। এটি কি সাধারণভাবে সেরা বিকল্প, নাকি আরও মানসম্মত ও সুন্দরতর উপায় আছে?

উত্তর:


23
SELECT a.a1,b.b1,  
    CASE WHEN b.b1 is NULL THEN 5 ELSE b.b2 END AS b2  
FROM a LEFT OUTER JOIN b  
ON a.a1 = b.b1

2
যখন প্রশ্নটি কেবল ট্যাগ করা হয় তখন দয়া করে এএনএসআই এসকিউএল ব্যবহার করুন sql(যার অর্থ "এসকিউএল কোয়েরি ভাষা" That ট্যাগটি কোনও নির্দিষ্ট ডিবিএমএস পণ্য বা উপভাষাকে বোঝায় না)। অংশ: [b2]=CASE WHEN ... ENDএকটি অবৈধ (মানক) এসকিউএল এক্সপ্রেশন।
a_horse_with_no_name

আমি একটি পোস্ট যুক্ত করেছি যাতে আমি পোস্টগ্রিসের নির্দিষ্ট উত্তরটি গ্রহণ করতে পারি indicate তবুও, সম্ভব হলে স্ট্যান্ডার্ড এসকিউএল পছন্দ করা হবে।
টম এলিস

@ কিন: আমার প্রশ্নের মতামত আমি জানি যে "আমি হাত দিয়ে" এটি করতে পেরে বি 1 আউটপুটে ন্যূনাল কিনা তা দেখে "সাধারণভাবে এটিই কি সেরা বিকল্প, নাকি আরও মানসম্মত ও পরিষ্কার উপায় আছে?"
টম এলিস

3
আপনি যেহেতু NUL এর মধ্যে পার্থক্য করতে চান যেহেতু একটি JOIN এর কারণে ঘটে এবং "প্রাকৃতিকভাবে" উপস্থিত তাদের মধ্যে এটি অনিবার্য যে আপনাকে বি 1 পরীক্ষা করতে হবে। হ্যাঁ, আপনি যদি "হস্ত দ্বারা" এটি "করতে" বলতে চেয়েছিলেন তবে এটাই একমাত্র উপায়।
মর্দচাই

@ মোড়ের্ডার: ঠিক আছে, আমি মনে করি আমি ভাবছিলাম যে এখানে "বাম আউটর জয়েন ... অন ... ডিফল্ট বি 2 = ..." এর মতো একটি বাক্য গঠন থাকতে পারে।
টম এলিস

2

এই প্রশ্নের আসল উত্তরটি অব্যক্ত নয়, সুতরাং আসুন এটি অন্য শট দিন।

একটি CASEবিবৃতি ব্যবহার করে

এই পদ্ধতিটি ব্যবহার করে আমরা শোষণ করি যে আমাদের আলাদা কলামে আমাদের আরও একটি মান রয়েছে যেIS NOT NULL এই ক্ষেত্রে b.b1যদি সেই মানটি শূন্য হয় তবে আমরা জানি যোগদান ব্যর্থ।

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.b1 is NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b  
  ON (a.a1 = b.b1);

এটি সম্পূর্ণরূপে কাজ করবে এবং আপনি যে সঠিক জিনিসটি চান তা উত্পন্ন করবে।

একটি সাব-নির্বাচন ব্যবহার করুন

এই পদ্ধতিটি ব্যবহার করবেন না, এটি বিল্ড-আপ ধারণা। পড়তে থাকুন।

আমরা যদিNOT NULL সেভাবে কাজে লাগাতে পারি এমন কোনও কলাম আমাদের কাছে না থাকে , আমাদের একটি কলাম তৈরি করতে এমন কিছু দরকার যা আমাদের পক্ষে সেভাবে কাজ করতে পারে ...

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.cond IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN (
  SELECT true AS cond, b.*
  FROM b
) AS b
  ON (a.a1 = b.b1);

একটি সারির তুলনা ব্যবহার করে

এমনকি সহজ তবে এরপরে একটি মিথ্যা মানকে বাধ্য করা যার জন্য আমরা তুলনা করতে পারি তা হল সারিটির তুলনা করা। PostgreSQL এ সারিটির সারণির নাম অনুসারে একটি মান রয়েছে। উদাহরণস্বরূপ, SELECT foo FROM fooটাইপ একটি সারিতে ফেরৎ fooটেবিল থেকে (যা একটি সারি প্রকার), foo। এখানে আমরা পরীক্ষা করে দেখি যে ROW নালাগুলি কিনা। এটি প্রতিটি কলামের মতো দীর্ঘ সময় কাজ করবে IS NOT NULL। এবং, যদি IS NULLআপনার টেবিলের প্রতিটি কলাম থাকে , তবে আপনি কেবল ট্রলিং করছেন।

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);

দ্রবণে b1ব্যবহৃত কলামটি CASEঅ-পরিবর্তনযোগ্য হওয়া দরকার না। উভয় ক্ষেত্রেই নির্মাণ কাজ করে।
ypercubeᵀᴹ

1

আমি এই ক্ষেত্রে COALESCE খুব দরকারী বলে মনে করি। এটি একটি তালিকা থেকে প্রথম নন নুল মান প্রদান করবে:

SELECT
 a.a1,
 b.b1,
 COALESCE (b.b2, 100) AS b2
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.