2012-05-01 13 views
5

मैं SQL चयन कथन में CASE का उपयोग करने का प्रयास कर रहा हूं जो मुझे परिणाम प्राप्त करने की अनुमति देगा जहां मैं एक स्ट्रिंग की लंबाई का उपयोग किसी अन्य स्ट्रिंग के पुनर्विक्रय का उत्पादन करने के लिए कर सकता हूं। ये दो डेटा सेटों से गैर-मिलान किए गए रिकॉर्ड के लिए हैं जो एक सामान्य आईडी साझा करते हैं, लेकिन वेरिएंट डेटा स्रोत साझा करते हैं।एसक्यूएल सर्वर में तारों से मेल खाने के लिए केस का उपयोग करना?

प्रकरण बयान नीचे है:

Select Column1, Column2, 
Case 
When Column1 = 'Something" and Len(Column2) = '35' Then Column1 = "Something Else" and substring(Column2, 1, 35) 
End as Column3 
From dbo.xxx 

जब मैं इसे चलाने मैं निम्न त्रुटि:

Msg 102, Level 15, State 1, Line 5 Incorrect syntax near '='.

+1

एसक्यूएल मतलब नहीं है यही कारण है कि। क्या आप कुछ उदाहरण डेटा दे सकते हैं और दिखा सकते हैं कि आप क्या होने की उम्मीद करते हैं? –

+0

यह सटीक एसक्यूएल है: चयन DATA_SOURCE, CustomerID, मामला जब DATA_SOURCE = 'Test1' और लेन (CUSTOMERNAME) = '35' फिर DATA_SOURCE = 'Test2' और सबस्ट्रिंग (CUSTOMERNAME, 1, 35) अंत के रूप में ग्राहक नाम dbo.xx – user1368436

+0

डेटा_Source ग्राहक आईडी ग्राहकनाम परीक्षण xxx xxx पीएलसी, (लंदन बीआर टेस्ट 1 xxx xxx पीएलसी (लंदन बीआर 2) – user1368436

उत्तर

1
Select 
    Column1, 
    Column2, 
    Case 
     When Column1 = 'Something' and Len(Column2) = 35 
     Then 'Something Else' + substring(Column2, 1, 35) 
    End as Column3 
From dbo.xxx 

अद्यतन पर

  1. उपयोग आपकी क्वेरी '+' स्ट्रिंग concat
  2. के लिए
  3. लेन() पूर्णांक देता है, ' "= स्तंभ 1" मामले में
  4. निकालें जब हालत
  5. "" के साथ बदलें' का उपयोग करने के ''

आशा इस मदद की कोई जरूरत नहीं।

+0

हाय सेनबुन, आपके सुझाव के लिए धन्यवाद। मैं यहां किसी भी डेटा को सम्मिलित नहीं कर रहा हूं। लंबाई में हेरफेर करने की आवश्यकता है डेटा ताकि रिटर्न वैल्यू एक ही लम्बाई हो। मुझे समझ में आ रहा है कि क्यों '=' ​​मेरे बाद के बाद एक त्रुटि उत्पन्न कर रहा है या एक सुझाव है कि मैं उसी आईडी के साथ रिकॉर्ड को सुविधाजनक बनाने के लिए कैसे उपयोग कर सकता हूं, संस्करण डेटा स्रोत से मिलान करने के लिए एक विशिष्ट की वापसी की लंबाई खेत। – user1368436

+0

क्या 'अन्य' मदद मिलेगी? नीचे की तरह या आप अपना वैल्यू स्टोर करने के लिए एक वैरिएबल @Result घोषित कर सकते हैं और अंत में वापस आ सकते हैं? 'का चयन करें स्तंभ 1, Column2, प्रकरण स्तंभ 1 = 'कुछ' और लेन (Column2) = जब 35 फिर 'समथिंग एल्स' + सबस्ट्रिंग (Column2, 1, 35) और \t स्तंभ 1 अंत के रूप में स्तम्भ 3 Dbo.xxx' – seanbun

2

आप प्रत्येक WHEN के लिए एक मूल्य की आवश्यकता है, और एक ELSE है चाहिए:

Select Data_Source, CustomerID, 
    CASE 
    WHEN Data_Source = 'Test1' and Len(CustomerName) = 35 THEN 'First Value' 
    WHEN Data_Source = 'Test2' THEN substring(CustomerName, 1, 35) 
    ELSE 'Sorry, no match.' 
    END AS CustomerName 
    From dbo.xx 

FYI करें: Len() एक स्ट्रिंग वापस नहीं करता है।

संपादित करें: एक एसक्यूएल सर्वर जवाब यह है कि कुछ टिप्पणियों को हो सकता है पते:

declare @DataSource as Table (Id Int Identity, CustomerName VarChar(64)) 
declare @VariantDataSource as Table (Id Int Identity, CostumerName VarChar(64)) 
insert into @DataSource (CustomerName) values ('Alice B.'), ('Bob C.'), ('Charles D.') 
insert into @VariantDataSource (CostumerName) values ('Blush'), ('Dye'), ('Pancake Base') 

select *, 
    -- Output the CostumerName padded or trimmed to the same length as CustomerName. NULLs are not handled gracefully. 
    Substring(CostumerName + Replicate('.', Len(CustomerName)), 1, Len(CustomerName)) as Clustermere, 
    -- Output the CostumerName padded or trimmed to the same length as CustomerName. NULLs in CustomerName are explicitly handled. 
    case 
    when CustomerName is NULL then '' 
    when Len(CustomerName) > Len(CostumerName) then Substring(CostumerName, 1, Len(CustomerName)) 
    else Substring(CostumerName + Replicate('.', Len(CustomerName)), 1, Len(CustomerName)) 
    end as 'Crustymore' 
    from @DataSource as DS inner join 
    @VariantDataSource as VDS on VDS.Id = DS.Id 
+0

से 'ईएलएसईई' भाग ट्रांजैक्ट-एसक्यूएल केस में अनिवार्य नहीं है (यदि वह था जिसका मतलब * चाहिए *)। –

+0

@AndriyM - यह एक "सर्वोत्तम प्रथाओं" सुझाव था। – HABO

+0

मैं अपने बयान में कई WHEN का उपयोग करने की कोशिश नहीं कर रहा हूं, इरादा रिकॉर्ड में डेटा को छेड़छाड़ करना है जहां आईडी समान है लेकिन डेटा स्रोत (कॉलम 1) भिन्न है इसलिए लौटाई गई लंबाई समान है। निश्चित रूप से ईएलएसई जोड़ना पाठ्यपुस्तक है, लेकिन जो मैं पूरा करने की कोशिश कर रहा हूं उससे विचलित नहीं होना चाहिए। क्या किसी को पता है कि मेरे बाद '=' जोड़ते समय मुझे वह त्रुटि क्यों मिलेगी? या एक समाधान जो प्रदान करता है जो मुझे इस फैशन में कब उपयोग करने की अनुमति देता है। किसी भी अन्य सुझाव की सराहना की है। – user1368436

संबंधित मुद्दे