Microsoft tSQL में कोई पंक्तियाँ नहीं मिलने पर मान लौटाएँ


95

SQL के Microsoft संस्करण का उपयोग करते हुए , यहां मेरी सरल क्वेरी है। अगर मैं एक रिकॉर्ड की खोज करता हूं जो मौजूद नहीं है तो मुझे कुछ भी नहीं मिलेगा। मैं पसंद करूंगा कि उस परिदृश्य में गलत (0) लौटा दिया जाए। बिना रिकॉर्ड के खाते की सबसे सरल विधि की तलाश।

SELECT  CASE
            WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1
            ELSE 0
        END AS [Value]

        FROM Sites S

        WHERE S.Id = @SiteId

जवाबों:


64
SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value]

FROM Sites S

WHERE S.Id = @SiteId and S.Status = 1 AND 
      (S.WebUserId = @WebUserId OR S.AllowUploads = 1)

नीचे क्वेरी अन्य स्थिति में एकल मान लौटाती है, लेकिन आदर्श रूप से इसे कई मान वापस करने चाहिए। काउंट केस (QTIB_REQ _) <1 तब 0 फिर QTIB_REQ_ अंत से qb_requisitions_all पर जहां QTIB_REQ_ IN ($ Req_disabled_WA) और CLIENT___BENCH___NON_BILLABLE NOT IN ('गैर-बिल योग्य' 'गैर-बिल') का चयन करें। SC क्लीयर स्ट्रैटेजिक हायर्स, 'बेंच / यूएस प्रोजेक्ट') और DATEIFF (CURDATE (), TARGET_FILL_DATE) <60 और DATEIFF (CURDATE (), TARGET_FILL_DATE)> 0
प्रणीत बहादुर

122

यह एडम रॉबिन्सन के समान है, लेकिन COUNT के बजाय ISNULL का उपयोग करता है।

SELECT ISNULL(
(SELECT 1 FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND 
      (S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0)

यदि आंतरिक क्वेरी में एक मिलान पंक्ति है, तो 1 लौटा दी जाती है। बाहरी क्वेरी (ISNULL के साथ) इसके बाद 1 का मान लौटाता है। यदि आंतरिक क्वेरी में कोई मिलान पंक्ति नहीं है, तो यह कुछ भी वापस नहीं करता है। बाहरी क्वेरी इसे NULL की तरह मानती है, और इसलिए ISNULL 0 वापस लौटता है।


2
इस एक को जोड़ने के लिए धन्यवाद! यह ठीक वैसा ही है, जैसा मुझे चाहिए, क्योंकि मैं सिर्फ ISNULL का चयन कर सकता हूं ((SELECT Id ...) 1 के बजाय डेटा ढूंढ रहा था!
जेसी स्मिथ

3
बहुत देर से, मुझे पता है, लेकिन आप उसी परिणाम को प्राप्त करने के लिए ISESULL को COALESCE से बदल सकते हैं।
BlueChippy

2
मैं ISNULL के बजाय COALESCE का उपयोग करने की आदत में पड़ गया क्योंकि, स्मृति से (आदतों को मुश्किल से मरना), ISNULL SQL लाइट में उपलब्ध नहीं है या जो भी कहा जाता है वह पुराने विंडोज मोबाइल उपकरणों पर चलता है। कोयला, लाइट, एक्सप्रेस और पूर्ण विकसित एसक्यूएल दोनों पर काम करता है।
विज्ञापन

1
यह बेहतर काम करता है, यदि आप 0 या 1 के बजाय परिवर्तनीय मूल्य प्राप्त करना चाहते हैं। एडम की क्वेरी के लिए ग्रुपिंग या ऐसा कुछ करने की आवश्यकता है।
द्राक्

@MoeSisko मुझे पसंद है कि यह 0 कैसे लौटता है यदि यह शून्य है, लेकिन 1 को वापस करने के बजाय, मैं इसे टेबल से मान वापस करने के लिए कैसे प्राप्त कर सकता हूं?
माइकल

21

यह एक मृत घोड़ा हो सकता है, 1 पंक्ति को वापस करने का एक और तरीका जब कोई पंक्तियां मौजूद नहीं होती हैं, तो एक अन्य क्वेरी को यूनिअन करें और तालिका में गैर मौजूद होने पर परिणाम प्रदर्शित करें।

SELECT S.Status, COUNT(s.id) AS StatusCount
FROM Sites S
WHERE S.Id = @SiteId
GROUP BY s.Status
UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS
SELECT 'N/A' AS Status, 0 AS StatusCount
WHERE NOT EXISTS (SELECT 1
   FROM Sites S
   WHERE S.Id = @SiteId
) 

2
मैंने क्वेरी से कुल योग प्राप्त करने की कोशिश करते समय एक समान विधि का उपयोग किया था। मैंने बस एक क्वेरी के साथ एक संघ किया था जो 0 ( SELECT 0) लौटा , फिर मैंने SUMयूनियन पर किया। सरल और पालन करने में आसान।
cjbarth

2
यदि यह 2 पंक्तियों को वापस करता है, तो क्या यह गारंटी है कि पंक्तियों को अपेक्षित क्रम में वापस किया जाएगा?
सरसापारिला

और यह निष्पादन योजना पर भारी है
Fandango68

12

कुछ इस तरह:

if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1))
    select 1
else
    select 0

मैंने इस समाधान का उपयोग किया क्योंकि यह मेरे लिए अधिक समझ में आता है (मैं परंपरागत रूप से एक SQL उपयोगकर्ता नहीं हूं), हालांकि, मैं SQL सर्वर का उपयोग कर रहा हूं, मैंने पाया कि इस समाधान में कॉल नाम को अच्छी तरह से जोड़कर। यानी आपके select 1और select 2मेरे बाद जोड़ाas <colName>
हार्वे

8

मैंने यहां सभी उत्तर पढ़े, और यह जानने में थोड़ा समय लगा कि क्या चल रहा है। निम्नलिखित मो सिस्को और कुछ संबंधित शोधों के उत्तर पर आधारित है

यदि आपकी SQL क्वेरी किसी भी डेटा को वापस नहीं करती है, तो एक शून्य मान के साथ कोई फ़ील्ड नहीं है, तो न तो ISNULL और न ही COALESCE काम करेगा जैसा आप उन्हें चाहते हैं। एक उप क्वेरी का उपयोग करके, शीर्ष स्तर की क्वेरी को एक शून्य मान के साथ एक फ़ील्ड मिलती है, और ISNULL और COALESCE दोनों काम करेंगे जैसा आप चाहते हैं / उनसे अपेक्षा करें।

मेरी क्वेरी

select isnull(
 (select ASSIGNMENTM1.NAME
 from dbo.ASSIGNMENTM1
 where ASSIGNMENTM1.NAME = ?)
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'

टिप्पणियों के साथ मेरी क्वेरी

select isnull(
--sub query either returns a value or returns nothing (no value)
 (select ASSIGNMENTM1.NAME
 from dbo.ASSIGNMENTM1
 where ASSIGNMENTM1.NAME = ?)
 --If there is a value it is displayed 
 --If no value, it is perceived as a field with a null value, 
 --so the isnull function can give the desired results
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'

5

आपको केवल WHFT को LEFT JOIN से बदलना होगा:

SELECT  CASE
        WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1
        ELSE 0
    END AS [Value]

    FROM (SELECT @SiteId AS Id) R
    LEFT JOIN Sites S ON S.Id = R.Id

यह समाधान आपको प्रत्येक कॉलम के लिए डिफ़ॉल्ट मान वापस करने की अनुमति देता है, उदाहरण के लिए:

SELECT
    CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1,
    S.Col2,
    ISNULL(S.Col3, 0) AS Col3
FROM
    (SELECT @Id AS Id) R
    LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ...

4

कोई रिकॉर्ड मिलान का मतलब है कि कोई रिकॉर्ड वापस नहीं आया। अगर कोई रिकॉर्ड नहीं मिलता है, तो जाने के लिए 0 के "मूल्य" के लिए कोई जगह नहीं है। आप परिणाम के सेट में रिकॉर्ड की संख्या की जांच करने के लिए एक पागल यूनिअन क्वेरी बना सकते हैं जो आप चाहते हैं लेकिन बहुत, बहुत, बहुत बेहतर है।


वर्तमान में, मैं यही करता हूं। जाँचें कि रिकॉर्ड की संख्या खाली है या नहीं। लगा कि वे मेरे चेक को शार्टकट करने का तरीका हो सकते हैं।
मैट

कुछ एप्लिकेशन आपको "बस" चेक की अनुमति नहीं देते हैं
नादिया सोलोयेवा

3

यह एक तरीका हो सकता है।

SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
    WHERE [conditions]
    UNION ALL
    SELECT 0 )A ORDER BY [Column Name] DESC

मुझे यह तरीका पसंद है। मुझे लगता है कि डिफ़ॉल्ट डेटा व्यक्त करते समय यह थोड़ा साफ है, खासकर यदि आप डेटा / डिफ़ॉल्ट मानों के कई स्तंभों के साथ समाप्त होते हैं।
मार्क रैम्प 51

लोल यह सबसे अच्छा और साफ समाधान है
काइल ब्रिडेनस्टाइन

1

टीआईईएस के बारे में क्या?

SELECT TOP 1 WITH TIES tbl1.* FROM 
        (SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 
                      AND (S.WebUserId = @WebUserId OR 
                           S.AllowUploads = 1)
                     THEN 1 
                     ELSE 0 AS [Value]
         FROM Sites S
         WHERE S.Id = @SiteId) as tbl1
ORDER BY tbl1.[Value]


0

@ हाई-फान के जवाब का उपयोग LEFT JOINकरना महत्वपूर्ण है, लेकिन इसका पालन करना थोड़ा कठिन हो सकता है। मेरे पास एक जटिल प्रश्न था जो कुछ भी नहीं लौटा सकता है। मैंने अपनी जरूरत के लिए उसका जवाब आसान कर दिया। कई कॉलम के साथ क्वेरी पर लागू करना आसान है।

;WITH CTE AS (
  -- SELECT S.Id, ...
  -- FROM Sites S WHERE Id = @SiteId
  -- EXCEPT SOME CONDITION.
  -- Whatever your query is
)
SELECT CTE.* -- If you want something else instead of NULL, use COALESCE.
FROM (SELECT @SiteId AS ID) R
LEFT JOIN CTE ON CTE.Id = R.ID

अद्यतन: SqlServerCentral पर यह उत्तर सबसे अच्छा है। यह MAX की इस विशेषता का उपयोग करता है - "जब कोई चयन करने के लिए कोई पंक्ति नहीं है, तो MAX पूर्ण रिटर्न देता है।"

SELECT ISNULL(MAX(value), 0) FROM table WHERE Id = @SiteId

0
You should avoid using expensive methods. You dont need any column for TBL2. 

SELECT COUNT(*) FROM(
         SELECT TOP 1     1 AS CNT  FROM  TBL1 
         WHERE ColumnValue ='FooDoo'  ) AS TBL2

or

IF EXISTS (SELECT TOP 1 1 FROM TABLE1 AS T1 
                          WHERE T1.ColumnValue='VooDoo') 
   SELECT 1 
ELSE 
   SELECT 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.