2012-05-01 13 views
5

CASEをSQL Select文で使用しようとしています。これにより、ある文字列の長さを利用して別の文字列の再作成を行うことができる結果が得られます。これらは、共通IDを共有する2つのデータセットの一致していないレコードで、バリアントデータソースです。Caseを使用して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 

I取得するには、次のエラー:

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

+1

。いくつかのサンプルデータを提供し、あなたが何が起こると予想されるかを示してください。 –

+0

これは正確なSQLです:DATA_SOURCE、得意先、 AS CASE DATA_SOURCE = 'Test1を' とレン(CustomerNameの)= '35' その後DATA_SOURCE = 'Test2を' とサブ(CustomerNameの、1、35) 終了を選択します得意先名 からdbo.xx – user1368436

+0

Data_Source CustomerID CustomerName Test xxx xxx PLC(LONDON BR Test1 xxx xxx PLC(LONDON 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. 使用上のクエリ '+'文字列連結の場合
  2. LEN()はintを返し、

・ホープ、このヘルプ ' '条件

  • は "" に置き換えたときに "=列1" の場合には
  • 削除'' を使用する必要はありません。

  • +0

    )誠に申し訳ありませんが、私はここにデータを連結することを検討していません。返される値が同じ長さになるようにデータを変換します。なぜ、 '='がTHENの後にエラーを引き起こしているのか、またはWHENを使用して同じIDのバリアントデータソース特定のフィールド。 – user1368436

    +0

    「その他」のヘルプですか?以下のようにするか、変数@Resultを宣言して値を格納し、最後に返すことができますか? ' 列1 = '何か' とレン(列2)は= 35 そして、 '何か他のもの' +サブ(列2、1、35)ELSE \t列1 エンドとしてCOLUMN3 列1、 列2、 ケースを選択from dbo.xxx' – seanbun

    2

    あなたは、各WHENの値を持っている必要があり、かつELSE有するべきである:FYI

    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 
    

    Len()は文字列を返しませんが。

    EDIT:コメントの一部に対処 SQL Serverの答えがあるかもしれない:SQLは意味がありません

    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

    関連する問題