टी-एसक्यूएल में बूलियन 'नहीं' 'बिट' डेटाटाइप पर काम नहीं कर रहा है?


82

एकल बूलियन नॉट ऑपरेशन करने की कोशिश करते हुए, ऐसा प्रतीत होता है कि एमएस SQL ​​सर्वर 2005 के तहत, निम्न ब्लॉक काम नहीं करता है

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;

इसके बजाय, मैं अधिक सफल हो रहा हूं

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;

फिर भी, यह एक नकारात्मक के रूप में कुछ के रूप में सरल व्यक्त करने के लिए थोड़ा मुड़ रास्ता दिखता है।

क्या मैं कुछ भूल रहा हूँ?


जवाबों:


152

~ ऑपरेटर का उपयोग करें:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean

11
ऐसा इसलिए है क्योंकि आप एक इंट का उपयोग कर रहे हैं, थोड़ा नहीं।
जोनास लिंकन

4
कॉलम थोड़ा है ... क्या DB संस्करण बात कर सकता है?
मार्टिन

मुझे पता है कि यह SQL Server 2008 में काम करता है। मैं हर समय ऐसा करता हूं। प्रश्न SQL सर्वर 2005 के लिए था, जो मुझे यकीन नहीं है कि यह वहां काम करता है या नहीं।
दान वानविंकल

3
सुधार: एमएस के अनुसार, यह 2005 में भी काम करना चाहिए। अधिक जानकारी यहाँ
दान वनविंकल

3
अच्छा जवाब, मैंने अभी-अभी इसका परीक्षण किया और SQL सर्वर 2000 में भी ठीक काम करता है।
अल्बर्टो मार्टिनेज

25

आपका समाधान एक अच्छा है ... आप SQL में थोड़ा टॉगल करने के लिए इस सिंटैक्स का उपयोग कर सकते हैं ...

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;

1
सिर्फ एक FYI के लिए, यह काम करता है क्योंकि यह विशेष रूप से बिटवाइज़ होता है। कई भाषाओं में XOR ऑपरेटर के रूप में भी। यह मूल रूप से ऐसा ही है, SET @MyBoolean = 1 - @MyBooleanसिवाय इसके कि यह पूर्णांक गणित के बजाय बिट गणित का उपयोग कर रहा है। हालांकि यह उचित है और काम करता है, यह उन लोगों को भ्रमित कर सकता है जो बिट गणित को नहीं समझते हैं। अधिक जानकारी यहाँ । @ जोनास लिंकन का समाधान बेहतर है।
दान वानविंकल

1
FYI के रूप में यह समाधान गणना किए गए फ़ील्ड के लिए काम करता है जबकि केस स्टेटमेंट नहीं होता है। धन्यवाद!
anyeone

22

1 से मूल्य घटाना ऐसा लगता है कि यह चाल चलेगा, लेकिन इरादे व्यक्त करने के संदर्भ में मुझे लगता है कि मैं इसके साथ जाना पसंद करूंगा:

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END

यह अधिक क्रिया है लेकिन मुझे लगता है कि इसे समझना थोड़ा आसान है।


10

उल्टे बिट को असाइन करने के लिए, आपको बिटवाइज़ NOT ऑपरेटर का उपयोग करना होगा। बिटवाइज़ NOT ऑपरेटर, '~' का उपयोग करते समय, आपको यह सुनिश्चित करना होगा कि आपका कॉलम या वेरिएबल बिट के रूप में घोषित किया गया है।

यह आपको शून्य नहीं देगा:

Select ~1 

यह करेगा:

select ~convert(bit, 1)

तो क्या यह होगा:

declare @t bit
set @t=1
select ~@t

9

SQL 2005 में वास्तविक बूलियन मान नहीं है, बिट मान वास्तव में कुछ और है।

एक बिट में तीन अवस्थाएँ हो सकती हैं, 1, 0 और अशक्त (क्योंकि यह डेटा है)। SQL स्वचालित रूप से इन्हें सही या गलत में नहीं बदलता (हालाँकि, भ्रमित करने वाला SQL एंटरप्राइज़ प्रबंधक होगा)

तर्क में बिट फ़ील्ड के बारे में सोचने का सबसे अच्छा तरीका एक पूर्णांक है जो 1 या 0 है।

यदि आप किसी बिट फ़ील्ड पर सीधे तर्क का उपयोग करते हैं, तो यह किसी भी अन्य मान चर की तरह व्यवहार करेगा - अर्थात तर्क सही होगा यदि इसका कोई मूल्य (किसी भी मूल्य) है और अन्यथा गलत है।


5

BIT एक संख्यात्मक डेटा प्रकार है, बूलियन नहीं। इसलिए आप बूलियन ऑपरेटरों को इसके लिए आवेदन नहीं कर सकते।
SQL सर्वर में BOOLEAN डेटा प्रकार (SQL SERVER 2008 के बारे में निश्चित नहीं है) इसलिए आपको @Matt हैमिल्टन के समाधान के साथ कुछ करना होगा।


4

ABSनिरपेक्ष मान प्राप्त करने के लिए उपयोग करें (-1 बन जाता है) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)

2
आप यह बताने से चूक गए कि -1पहले कभी क्यों पैदा होगा। यह है: यह नहीं होगा, अगर घटाव अधिक तार्किक / सहज रूप में व्यक्त किया जाता है जिसे ओपी ने इस्तेमाल किया। यह ऐसा करने के लिए एक निरर्थक गूढ़ और गोल-गोल तरीका है।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.