2012-05-01 35 views
5

我正在嘗試在SQL Select語句中使用CASE,這將允許我獲得結果,以便可以利用一個字符串的長度生成另一個字符串的結果。這些用於來自兩個數據集的不匹配記錄,這兩個數據集共享一個公共ID,但是是變體數據源。使用大小寫來匹配SQL Server中的字符串?

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

即SQL沒有意義。你能舉出一些示例數據並展示你期望發生的事情嗎? –

+0

這是確切的SQL:選擇DATA_SOURCE,客戶ID, CASE WHEN DATA_SOURCE = '測試1' 和Len(客戶名稱)= '35' 然後DATA_SOURCE = '的Test2' 和子串(客戶名稱,1,35) 完AS客戶姓名 來自dbo.xx – user1368436

+0

Data_Source客戶ID客戶名稱測試xxx xxx PLC,(倫敦BR測試1 xxx xxx PLC(倫敦BR2) – 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. LEN()返回INT,沒必要用'
  3. 刪除 「列1 =」 的情況下,當條件
  4. 替換 「」 與 ''

希望這有助於。

+0

嗨Seanbun,感謝您的建議,我不打算連接任何數據。我希望瞭解爲什麼'='在我的THEN之後導致錯誤,或者我建議我如何使用WHEN來簡化具有相同ID,不同數據源的記錄以匹配返回一個特定的長度領域。 – user1368436

+0

'其他'會有幫助嗎?像下面一樣,或者你可以聲明一個變量@Result來存儲你的值並在最後返回? '選擇 列1, 列2, 案例 當列1 = '東西' 和Len(列2)= 35 然後 '別的東西' +子(列2,1,35) \t ELSE column1的 完如欄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()不會返回一個字符串。

編輯: ,解決一些意見可能是一個SQL Server的答案:

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

'ELSE'部分在Transact-SQL CASE中不是強制性的(如果這是你應該*的意思)。 –

+0

@AndriyM - 這是一個「最佳實踐」的建議。 – HABO

+0

我不想在我的語句中使用多個WHEN,其目的是操縱ID相似但數據源(Column1)不同的記錄中的數據,因此返回的長度是相同的。當然,添加ELSE是教科書,但不要分心我想要完成的東西。有沒有人知道爲什麼我會在我的THEN後添加'='時出現這種錯誤?或者提供一個解決方案,允許我以這種方式使用WHEN。任何其他建議表示讚賞。 – user1368436