2013-03-14 7 views
14

में स्तंभों के बीच एक समानता की जांच का उपयोग करते हुए मैं Microsoft SQL Server 2012 का उपयोग कर रहा है और मैं इस कदाचित सरल क्वेरी चलाने के लिए करना चाहते हैं:एक SELECT खंड

SELECT 
    FirstEvent.id AS firstEventID, 
    SecondEvent.id AS secondEventID, 
    DATEDIFF(second, FirstEvent.WndFGEnd, SecondEvent.WndFGStart) AS gap, 
    FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck 
FROM VibeFGEvents AS FirstEvent 
RIGHT OUTER JOIN VibeFGEvents AS SecondEvent 
ON 
    FirstEvent.intervalMode = SecondEvent.intervalMode 
    AND FirstEvent.id = SecondEvent.id - 1 
    AND FirstEvent.logID = SecondEvent.logID 

हालांकि FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheckSELECT खंड में गलत वाक्यविन्यास है।

SELECT [ ALL | DISTINCT ] 
[ TOP (expression) [ PERCENT ] [ WITH TIES ] ] 
<select_list> 
<select_list> ::= 
    { 
     * 
     | { table_name | view_name | table_alias }.* 
     | { 
      [ { table_name | view_name | table_alias }. ] 
       { column_name | $IDENTITY | $ROWGUID } 
      | udt_column_name [ { . | :: } { { property_name | field_name } 
      | method_name (argument [ ,...n]) } ] 
      | expression 
      [ [ AS ] column_alias ] 
      } 
     | column_alias = expression 
    } [ ,...n ] 

मुझे लगता है कि इसका मतलब है कि एक अभिव्यक्ति का चयन खंड में मान्य है और वास्तव में दिए गए उदाहरण 1 + 2 तरह बातें शामिल हैं: लेकिन the SELECT Clause (Transact-SQL) documentation इस वाक्य रचना भी शामिल है। the documentation for expressions को देखते हुए:

{ constant | scalar_function | [ table_name. ] column | variable 
    | (expression) | (scalar_subquery) 
    | { unary_operator } expression 
    | expression { binary_operator } expression 
    | ranking_windowed_function | aggregate_windowed_function 
} 

बूलियन समानता के चेक कर रहे हैं वैध भाव और वास्तव में the = (Equals) (Transact-SQL) documentation में दिए गए उदाहरण अभिव्यक्ति एक भी शामिल है:

SELECT DepartmentID, Name 
FROM HumanResources.Department 
WHERE GroupName = 'Manufacturing' 

WHERE खंड में यद्यपि नहीं SELECT खंड। ऐसा लगता है कि मैं अपने SELECT खंड में अभिव्यक्तियों की तुलना करने के लिए समानता ऑपरेटर = का उपयोग नहीं कर सकता क्योंकि उन्हें गलत तरीके से असाइनमेंट के रूप में व्याख्या किया जा रहा है।

मैं अपने SELECT खंड में FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck के समतुल्य बूलियन समानता कॉलम तुलना कैसे शामिल करूं?

+1

'' पर एक नज़र डालें, परिभाषा: 'column_alias = अभिव्यक्ति' कॉलम एलियासिंग का एक वैकल्पिक रूप है। –

+0

मैंने देखा कि, लेकिन मैं उम्मीद करता हूं कि संकलक तुलना से एलियासिंग को अलग करने में सक्षम हो। मेरे लिए व्यक्तिगत रूप से उन्हें अलग रखना ('AS' का उपयोग करके एलआईसिंग,' = 'का उपयोग करके असाइनमेंट, और' ==' का उपयोग करके तुलना) लेकिन मुझे लगता है कि ऐतिहासिक कारण हैं कि टीएसक्यूएल इस तरह स्पष्ट कट क्यों नहीं है? – dumbledad

उत्तर

22
इस तरह

:

case when FirstEvent.TitleID = SecondEvent.TitleID then 1 else 0 end as titlesSameCheck 
11

आप बूलियन जैसे सीधे सशर्त बयान (मामले में, जहां, होने, आदि) को छोड़कर

सबसे अच्छा तरीका है अपनी समस्या को हल करने के लिए उपयोग नहीं कर सकते की तरह कुछ करने के लिए है

select case when x = y then 'true' else 'false' end 

bit प्रकार शायद निकटतम बूलियन है।

select CAST(case when x = y then 1 else 0 end as bit) 

बेशक, जो भी दो मूल्य सबसे अच्छा प्रतिनिधित्व करते हैं, उसके बाद आप जो भी कर रहे हैं उसका उपयोग करें।

+0

मैंने डाउन-वोट नहीं किया लेकिन मैं स्ट्रिंग 'सत्य'/'झूठी' का उपयोग करने के खिलाफ अनुशंसा करता हूं।एसक्यूएल में थोड़ा (बूलियन) है और इसका इस्तेमाल किया जाना चाहिए। –

+0

पोस्ट करने के तुरंत बाद उस पर विचार, धन्यवाद! – pyrospade

1

दो मौजूदा उत्तर राज्य के रूप में, बूलियन मान कॉलम मान के रूप में वापस नहीं किए जा सकते हैं। यह Comparison Operators section में दर्ज है:

अन्य एसक्यूएल सर्वर डेटा प्रकारों के विपरीत, एक बूलियन डेटा प्रकार एक तालिका स्तंभ या चर के डेटा प्रकार के रूप में निर्दिष्ट नहीं किया जा सकता है, और एक परिणाम सेट में वापस नहीं जा सकता है।

मूल्य को बदलने के लिए CASE का उपयोग करके प्रतिबंध को देखते हुए, यह प्रदर्शित करने के लिए आपका सबसे अच्छा विकल्प है।

+0

+1 जहां दस्तावेज़ में मैं वास्तव में इसे से कम कर सकता हूं इंगित करने के लिए +1; धन्यवाद एलन – dumbledad