क्या कुछ के रूप में सीधे EXISTS का चयन करना संभव है?


185

मैं सोच रहा था कि क्या ऐसा कुछ करना संभव है (जो काम नहीं करता):

select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)

ऐसा लगता है कि यह करने योग्य होना चाहिए, लेकिन बहुत सी चीजें जो एसक्यूएल में काम नहीं करना चाहिए;) मैंने इसके लिए वर्कअराउंड देखा है (चयन 1 जहां ... मौजूद है ...) लेकिन ऐसा लगता है जैसे मुझे बस करने में सक्षम होना चाहिए मौजूद फ़ंक्शन के परिणाम को थोड़ा सा कास्ट करें और इसके साथ किया जाए।

जवाबों:


267

नहीं, आपको वर्कअराउंड का उपयोग करना होगा।

यदि आपको एक सशर्त बिट लौटना होगा 0/1 एक और तरीका है:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

या कलाकारों के बिना:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
यदि आप परिणाम को बिट डेटापाइप में स्टोर कर रहे हैं तो आपको कलाकारों की आवश्यकता नहीं है क्योंकि कलाकार पहले से ही निहित है।
माइकटीवई

3
बस इस तकनीक का परीक्षण किया, महान काम करता है। SQL Server 2008 R2 के साथ परीक्षण किए गए क्वेरी से परिणाम प्राप्त करने के लिए CAST to BIT आवश्यक नहीं है।
तोरेंस्टेड

मेरे मामले में कलाकारों को हटा दिया जाना चाहिए
सेर्जियो एस। फिल्हो

50
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

जब आप बिट करने के लिए डाली

  • ० -> ०
  • बाकी सब -> १
  • और NULL -> NULL बेशक, लेकिन आप बिना GROUP (CO) के COULL (*) के साथ NULL नहीं पा सकते

bitनक्शे में सीधे boolean.net डेटाटाइप्स, भले ही यह वास्तव में नहीं है ...

यह समान दिखता है, लेकिन कोई मेल नहीं होने पर कोई पंक्ति नहीं देता है (शून्य नहीं), इसलिए यह समान नहीं है

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'

4
लेकिन यह बिल्कुल भी उपयोग नहीं करता है। मैं यह नहीं पूछ रहा था कि इसे कैसे हल किया जाए, मैं वर्कअराउंड ढूंढ सकता हूं, मैं पूछ रहा था कि क्या उपयोग करने के लिए कुछ चाल मौजूद है जैसे कि मुझे पता नहीं था।
जेकोलम

6
यह वर्कअराउंड नहीं है, यह सेट-वाइज एक सही तरीका है। EXISTS यह वर्कअराउंड है ... और बहुत साफ है, नहीं?
gbn

1
@jcollum: हाँ, या ऐसा कुछ। EXISTS लगभग हमेशा IF EXTSTS या WHIS EXISTS है और आउटपुट के लिए उपयोग नहीं किया जाता है जैसे आप करने की कोशिश कर रहे हैं
gbn

14
रिकॉर्ड के अस्तित्व की जाँच करते समय EXISTS COUNT से अधिक कुशल है - देखें sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/……
ताहिर हसन

9
इसके विपरीत EXISTS, COUNTपहले एक को खोजने के बाद भी पंक्तियों के मिलान के लिए डेटा को देखता रहेगा क्योंकि उसे गिनती प्राप्त करने की आवश्यकता होती है।
इस्माइल

11

मैं इसके लिए थोड़ा आगे हूँ; बस पोस्ट के पार ठोकर खाई। हालांकि यहां एक समाधान है जो चयनित उत्तर की तुलना में अधिक कुशल और साफ है, लेकिन समान कार्यक्षमता देनी चाहिए:

declare @t table (name nvarchar(16))
declare @b bit

insert @t select N'Simon Byorg' union select N'Roe Bott'


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0)
select @b whenTrue

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0)
select @b whenFalse

7

आप उपयोग कर सकते हैं IIFऔरCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)

1
मुझे यह पसंद है, लेकिन यह केवल SQL सर्वर 2012 और ऊपर में काम करता है। 2012 में IIF की तरह लग रहा था
ja928

4

आप निम्न कार्य भी कर सकते हैं:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'

यदि 'वेल्यू' के साथ शुरू होने वाले कोई मूल्य नहीं हैं, तो यह थोड़ा 0 के बजाय शून्य (कोई रिकॉर्ड) नहीं लौटेगा


2

नहीं, यह संभव नहीं है। बिट डेटा प्रकार एक बूलियन डेटा प्रकार नहीं है। यह एक पूर्णांक डेटा प्रकार है जो 0,1 या NULL हो सकता है।


3
@bzlm हाँ यह SQLServer में 10 वर्षों से अधिक समय तक रह सकता है। SQL सर्वर 7.0 ने इसे msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
मार्टिन स्मिथ

4
@bzlm - ऐसा लगता है कि आप तिनके में जकड़े हुए हैं और वास्तव में मेरे लिए SQL सर्वर डेटा प्रकारों के बारे में कुछ भी नहीं जानते हैं। SQL सर्वर में बिट की परिभाषा "एक पूर्णांक डेटा प्रकार है जो 1, 0, या NULL का मान ले सकता है।"msdn.microsoft.com/en-us/library/ms177603.aspx । यह स्तंभों पर लागू होता है और SQL चर का लेन-देन करता है। IF(@TRUE)उदाहरण के लिए SQL में बूलियन के रूप में कहीं भी एक बिट वैरिएबल का उपयोग नहीं किया जा सकता है और न ही इसके विपरीत एक बूलियन अभिव्यक्ति को थोड़ा सा किया जा सकता है। (उदाहरण के साथ SET @BitVariable = (1=1))
मार्टिन स्मिथ

1
मैं देख रहा हूं कि आप कहां जा रहे हैं, लेकिन बिट को कास्टिंग इतना मुद्दा नहीं था क्योंकि सीधे सीधे चयन करने में सक्षम था।
jcollum

1

एक अन्य समाधान ISNULLके साथ मिलकर में उपयोग करना है SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)

-1

मेरा मानना है कि मौजूद का उपयोग केवल एक क्लॉज में किया जा सकता है, इसलिए आपको एक वर्कअराउंड (या जहां क्लॉज के रूप में मौजूद है) के साथ एक सबकुछ करना होगा। मुझे नहीं पता कि अगर वह वर्कअराउंड के रूप में गिना जाता है।

इस बारे में क्या:

create table table1 (col1   int null)
go
select 'no items',CONVERT(bit, (select COUNT(*) from table1) )   -- returns 'no items', 0
go
insert into table1 (col1) values (1)
go
select '1 item',CONVERT(bit, (select COUNT(*) from table1) )     --returns '1 item', 1
go
insert into table1 (col1) values (2)
go
select '2 items',CONVERT(bit, (select COUNT(*) from table1) )    --returns '2 items', 1
go
insert into table1 (col1) values (3)
go
drop table table1
go

चुनिंदा मामलों में क्या होता है?
लोअरकी

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