शून्य पंक्तियों से मेल खाने पर भी निरंतर मान लौटाने का चयन करें


15

इस चुनिंदा कथन पर विचार करें:

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

यह एक खिलाड़ी के अन्य कॉलम के query_idसाथ मूल्य 1के साथ कॉलम लौटाता है ।

कैसे एक कम से कम ऊपर एसक्यूएल वापसी होगा query_idकी 1भी चयन पाता है, तो कोई भी पंक्ति उस मैच?

BTW, यह PostgreSQL 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
@ नोट: यदि आपको किसी विशिष्ट आदेश की आवश्यकता है, तो आपको आपूर्ति करनी होगी order by। दूसरा एक "एक वर्चुअल टेबल बनाता है जिसमें बिलकुल एक पंक्ति और एक कॉलम होता है और एक बाहरी जुड़ता है (बिना किसी" वास्तविक "जुड़ाव की स्थिति में), इस प्रकार आप हमेशा कम से कम उस एक पंक्ति को प्राप्त करते हैं। select *उत्पादन कोड का उपयोग करना खराब शैली है। यह मत करो। हमेशा उन कॉलम को सूचीबद्ध करें जिनकी आपको आवश्यकता है। केवल तदर्थ प्रश्नों में उपयोग किया select *जाना चाहिए ।
a_horse_with_no_name

2
@NatWeiss: क्या "अन्य जोड़" के लिए "वैकल्पिक वाक्यविन्यास" आप का उल्लेख कर रहे हैं। और आपको क्यों लगता 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';

यदि कोई पंक्ति नहीं मिली है, तो क्वेरी_id को छोड़कर सभी मानों के साथ एक पंक्ति वापस आ जाएगी।


2
अच्छी चाल। एकमात्र दोष यह है कि col1 और col2 के लिए मान एक ही पंक्ति के नहीं हो सकते हैं, यदि स्थिति से मेल खाने वाले एक से अधिक हैंusername = 'foobar'
a_horse_with_no_name

1
क्या इस तरीके से भी कोलेससे () का इस्तेमाल किया जा सकता है?
नथानेल वीस

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;

केवल "रिक्त" पंक्ति लौटाएगा यदि "a" की पूरी सामग्री शून्य है।

का आनंद लें। / bithead


-1
select isnull(column,1) from table

2
जब क्वेरी 0 पंक्तियों को वापस करती है तो यह एक अतिरिक्त पंक्ति उत्पन्न नहीं करेगी।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.