শূন্য সারি মেলে এমনকি স্থির মান ফেরত পেতে নির্বাচন করা


15

এই নির্বাচিত বিবৃতি বিবেচনা করুন:

SELECT *, 
       1 AS query_id 
FROM players 
WHERE username='foobar';

এটি প্লেয়ারের অন্যান্য কলামগুলির সাথে কলামটি query_idমান 1সহ করে দেয়।

কিভাবে এক অন্তত উপরে এসকিউএল প্রত্যাবর্তন করতে হবে query_idএর 1এমনকি নির্বাচন খুঁজে বের করে যদি কোনো সারি ম্যাচের?

বিটিডাব্লু, এটি পোস্টগ্রিজ এসকিউএল 8.4।

উত্তর:


22
SELECT col1, 
       col2, 
       col3, 
       1 AS query_id 
FROM players 
WHERE username='foobar'
union all 
select null,
       null,
       null,
       1
where not exists (select 1 from players where username = 'foobar');

বা বিকল্প হিসাবে ( দ্বিতীয় উপ-সাবলেট প্রয়োজন না হওয়ায় দ্রুত হতে পারে):

with qid (query_id) as (
   values (1)
) 
select p.*, 
       qid.query_id
from qid 
  left join players as p on (p.useranme = 'foobar');

আপনি উপরের আরও একটি "কমপ্যাক্ট" উপস্থাপনায় আবার লিখতে পারেন:

select p.*, 
       qid.query_id
from (values (1)) as qid (query_id)
  left join players as p on (p.useranme = 'foobar');

তবে আমি মনে করি সুস্পষ্ট সিটিই ( with...) আরও পঠনযোগ্য (যদিও এটি সর্বদা দর্শকের চোখে থাকে)।


1
প্রথম উদাহরণটি চেষ্টা করে দেখে মনে হচ্ছে যে সমস্ত কীওয়ার্ডের প্রয়োজন নেই?
নাথানেল ওয়েইস

2
@NatWeiss: আপনি একটি নির্দিষ্ট অনুক্রম, আপনি আছে একটি সরবরাহ order by। দ্বিতীয়টি হ'ল একটি সারি এবং একটি কলাম সহ একটি ভার্চুয়াল টেবিল "তৈরি" করে এবং এটি একটি বাইরের সাথে যুক্ত হয় (কোনও "প্রকৃত" যোগদানের শর্ত ছাড়াই), সুতরাং আপনি সর্বদা কমপক্ষে একটি সারিটি ফিরে পাবেন। select *প্রোডাকশন কোড ব্যবহার করা খারাপ স্টাইল। এটা করবেন না। আপনার প্রয়োজনীয় কলামগুলি সর্বদা তালিকাভুক্ত করুন। শুধুমাত্র অ্যাড-হক প্রশ্নগুলিতে ব্যবহার করা select *উচিত ।
a_horse_with_no_name

2
@ নাটউইস: "অন্যান্য যোগদানের" জন্য "বিকল্প সিনট্যাক্স" কী আপনি উল্লেখ করছেন? এবং আপনি কেন left joinপঠনযোগ্য নয় বলে মনে করেন ?
a_horse_with_no_name

2
@ নাটউইস: যেখানে ক্লজটি খারাপ কোডিং শৈলীর অন্তর্নিহিত যোগদান এবং এড়ানো উচিত। এটি আপনাকে কোনও ত্রুটি না দিয়ে অযাচিত কার্টেসিয়ানদের সাথে যোগ দিতে পারে। এবং এটি যোগদানের এবং ফিল্টারিংয়ের দুটি (সম্পর্কিত) ধারণাগুলি স্পষ্টভাবে পৃথক করে
a_horse_with_no_name

4
পুনরায়: "ইউনিয়ন" ধারাটির "সমস্ত" সংশোধক প্রয়োজন হয় না: UNION ALLকখনও কখনও তুলনায় আরও দক্ষ হতে পারেন UNION, যেহেতু আপনি স্পষ্টভাবে ক্যোয়ার পরিকল্পনাকারীকে বলছেন যে আপনি কোনওভাবে UNIONএড কোয়েরি থেকে কোনও সদৃশ সারি বেরিয়ে আসার প্রত্যাশা করছেন বা যদি আপনি তাদের আউটপুট হতে চান। ALLসংশোধক ছাড়াই এটি ধরে নেওয়া হয়েছে যে আপনি DISTINCTকীওয়ার্ডের মতোই ডুপ্লিকেট সারিগুলি মুছে ফেলতে চান (প্রতিটি প্রত্যাবর্তনের মধ্যে কেবল একটিই) এবং গ্যারান্টিটি দেওয়ার জন্য যে এটির পুনরূদ্ধার প্রয়োজন হতে পারে + অতিরিক্ত সময় পুনরুদ্ধার করতে হবে। তাই ব্যবহার ALLসঙ্গে UNIONযদি না আপনি বিশেষভাবে আউটপুট সারি প্রয়োজন ডি অনুলিপি।
ডেভিড স্পিলিট

7

আপনি যদি কেবল এক বা শূন্য সারিটি প্রত্যাশা করেন তবে এটিও কাজ করবে:

SELECT
  max(col1) col1,
  max(col2) col2, 
  1 AS query_id 
FROM
  players 
WHERE
  username='foobar';

এটি কোনও সারি পাওয়া না গেলে কোয়েরি_আইড বাদে সমস্ত মান শূন্য থাকার সাথে এক সারি ফিরে আসবে।


2
দুর্দান্ত কৌশল। একমাত্র অপূর্ণতা হ'ল কল 1 এবং কল 2 এর মানগুলি একই সারিতে নাও থাকতে পারে, যদি শর্তের সাথে একাধিক মিল থাকেusername = 'foobar'
a_horse_with_no_name

1
Coalesce () এছাড়াও এই ফ্যাশন ব্যবহার করা যেতে পারে?
নাথানেল ওয়েইস

1
কোলেসেস এমন একটি সারি তৈরি করতে পারে না যেখানে টেবিল থেকে কোনওটিই প্রত্যাশিত হয় না।
ডেভিড অলড্রিজ

1
@a_horse_with_no_name হ্যাঁ, যদিও সারণী এবং কলামের নামগুলি প্রস্তাব দেয় যে প্রিডিকেটটি টেবিলের জন্য প্রার্থী কীতে রয়েছে, সুতরাং শূন্য বা এক সারিটি অনুমান করা হবে।
ডেভিড অলড্রিজ

3

এখানে দেরিতে চিমিং, তবে এখানে একটি সিনট্যাক্স যা কাজ করে (কমপক্ষে 9.2 এ, পূর্ববর্তী সংস্করণগুলি চেষ্টা করে না)।

SELECT (COALESCE(a.*,b.*::players)).*
FROM ( SELECT col1,  col2,  col3, 1 AS query_id 
       FROM players WHERE username='foobar' ) a
RIGHT JOIN (select null col1, null col2, null col3, 1 col4) b
ON a.query_id = b.col4;

"ক" এর সম্পূর্ণ সামগ্রী শূন্য হলে কেবল "ফাঁকা" সারিটি ফিরিয়ে দেবে Will

উপভোগ করুন। / bithead


-1
select isnull(column,1) from table

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