SQL चयन विवरण पर बूलियन मान लौटाएं


144

SQL चयन विवरण पर बूलियन मान कैसे लौटाएं?

मैंने इस कोड की कोशिश की:

SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

और यह केवल तभी लौटता है TRUEजब UserIDटेबल पर मौजूद हो। मैं चाहता हूं कि FALSEअगर यह UserIDटेबल पर मौजूद नहीं है तो वापस लौटना होगा ।


3
कौन सी dbms? Sql भिन्न का विवरण।
joshp

एसक्यूएल सर्वर एक बूलियन प्रकार का समर्थन नहीं करता है जैसे SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result- एक त्रुटि के परिणामस्वरूप अर्थात एक CAST(1 AS BIT)ही तार्किक TRUE नहीं है।
onedaywhen

जवाबों:


253

आपके पास जो कुछ भी है, यदि उपयोगकर्ता मौजूद नहीं है तो कोई पंक्ति नहीं लौटेगी। यहाँ आपको क्या चाहिए:

SELECT CASE WHEN EXISTS (
    SELECT *
    FROM [User]
    WHERE UserID = 20070022
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END

2
तारांकन का उपयोग क्यों करें, यह बेहतर है यदि आप 1इसके बजाय का उपयोग करते हैं *

7
@ robertpeter07 - दो समान हैं, लेकिन *अधिक मुहावरेदार है। इस प्रश्न को देखें ।
चाड

यदि WHILE लूप का उपयोग किया जाता है, तो क्या मुझे 'WHILE' के ठीक बाद इसे लटके {} के अंदर रखना होगा?
full_prog_full

क्या आप दिए गए मान में कॉलम नाम जोड़ सकते हैं?
xMetalDetectorx

3
@xMetalDetectorx इसने मेरे लिए कॉलम नाम जोड़ने के लिए काम किया ( AS boolभाग बहुत महत्वपूर्ण है):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
लुसियो मोलिंडो

31

संभवतः इन पंक्तियों के साथ कुछ:

SELECT CAST(CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS BIT)
FROM dummy WHERE id = 1;

http://sqlfiddle.com/#!3/5e555/1


6
यह एक स्ट्रिंग देता है, बूलियन नहीं
ओएमजी पोनीज़

कॉलम नाम शामिल करने के लिए यह एक अच्छा अभ्यास है - Select CAST (CASE WHEN COUNT (*)> 0 THEN 1 ELSE 0 END AS BIT) के रूप में mycolumnname Fummy से डमी जहां = 1
डिएगो Alves

22

यह देखते हुए कि आम तौर पर 1 = trueऔर 0 = false, आपको बस इतना करना है कि पंक्तियों की संख्या की गणना करें, और एक को कास्ट करें boolean

इसलिए, आपके पोस्ट किए गए कोड को केवल एक COUNT()फ़ंक्शन जोड़ा जाना चाहिए:

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

8
बड़ी संख्या में पंक्तियों के साथ तालिकाओं पर परीक्षण Exists(करने की तुलना में परीक्षण करना बहुत तेज है Count(1)
स्कॉट चेम्बरलेन

5
शायद। मैंने अपने उत्तर में प्रदर्शन के लिए कोई दावा नहीं किया, ओपी को जो चाहिए था उसे प्राप्त करने के लिए केवल न्यूनतम कोड परिवर्तन। हालाँकि, यदि स्तंभ UserIDअनुक्रमित है (या यहां तक ​​कि पीके है) तो निश्चित रूप से आप एक अद्वितीय पंक्ति में सीधे जा रहे हैं जो मौजूद है (या नहीं)।
स्टीवर्ट

9

'एक्ज़िस्ट' का उपयोग करें जो 0 या 1 रिटर्न करता है।

क्वेरी इस प्रकार होगी:

SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)

10
त्रुटि: "कीवर्ड 'EXISTS' के पास गलत सिंटैक्स।" sqlfiddle.com/# .18
ef905/

8
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)

यदि गिनती (*) = 0 झूठी है। अगर गिनती (*)> 0 रिटर्न सही है।


4

मैं इसे इस तरह से करता हूं:

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022

एक बूलियन के रूप में देखना कभी भी अशक्त नहीं हो सकता (कम से कम .NET में), यह डिफ़ॉल्ट रूप से गलत होना चाहिए या आप इसे स्वयं के लिए सेट कर सकते हैं यदि यह डिफ़ॉल्ट रूप से सत्य है। हालांकि 1 = सत्य, इतना शून्य = असत्य, और कोई अतिरिक्त वाक्यविन्यास नहीं।

नोट: मैं अपने माइक्रो ऑर्म के रूप में डैपर का उपयोग करता हूं, मुझे लगता है कि एडीओ को भी यही काम करना चाहिए।


मेरा पसंदीदा, अब तक का सबसे संक्षिप्त जवाब। सभी उत्तरों की फ़ेल्ड
ef905/

"एक बूलियन के रूप में देखना कभी भी शून्य नहीं हो सकता (कम से कम .NET में)।" (बूल?) एक अशक्त बूल है।
एंड्रयू डेनिसन

1

एक और समतुल्य समस्या पर ध्यान दें: यदि स्थिति संतुष्ट है और अन्यथा एक खाली परिणाम देता है तो एक SQL क्वेरी बनाता है (1)। ध्यान दें कि इस समस्या का समाधान अधिक सामान्य है और आपके द्वारा पूछे गए प्रश्न को प्राप्त करने के लिए उपरोक्त उत्तरों के साथ आसानी से उपयोग किया जा सकता है। चूंकि यह समस्या अधिक सामान्य है, इसलिए मैं आपकी समस्या के ऊपर प्रस्तुत किए गए सुंदर समाधानों के अलावा इसका समाधान भी साबित कर रहा हूं।

SELECT DISTINCT 1 AS Expr1
FROM [User]
WHERE (UserID = 20070022)

1

उन लोगों के लिए जो एक कस्टम कॉलम नाम जोड़ने के लिए मूल्य प्राप्त करने में रुचि रखते हैं, यह मेरे लिए काम कर रहा है:

CAST(
    CASE WHEN EXISTS ( 
           SELECT * 
           FROM mytable 
           WHERE mytable.id = 1
    ) 
    THEN TRUE 
    ELSE FALSE 
    END AS bool) 
AS "nameOfMyColumn"

आप कॉलम नाम से दोहरे उद्धरण चिह्नों को छोड़ सकते हैं यदि आप नाम की केस संवेदनशीलता (कुछ क्लाइंट में) रखने में रुचि नहीं रखते हैं।

मैंने इसके लिए @ चाड के जवाब को थोड़ा घुमा दिया।


एमएसजी 102, स्तर 15, राज्य 1, लाइन 8 'कास्ट' के पास गलत सिंटैक्स। Msg 156, Level 15, State 1, Line 12 कीवर्ड 'THEN' के पास गलत सिंटैक्स।
शेन

@ShaneC मैंने PostgreSQL 9.X पर इस कोड का परीक्षण किया और यह ठीक काम किया। आप किस सर्वर का उपयोग कर रहे हैं?
लुसियो मोलीडीनो

0
DECLARE @isAvailable      BIT = 0;

IF EXISTS(SELECT 1  FROM [User] WHERE (UserID = 20070022))
BEGIN
 SET @isAvailable = 1
END

प्रारंभ में उपलब्ध बकाया बूलियन मान 0 पर सेट है

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