2012-05-01 10 views
5

Sto cercando di utilizzare CASE in un'istruzione SQL Select che mi consentirà di ottenere risultati in cui è possibile utilizzare la lunghezza di una stringa per produrre i resutls di un'altra stringa. Si tratta di record non corrispondenti provenienti da due set di dati che condividono un ID comune, ma una diversa origine dati.Utilizzo del caso per far corrispondere le stringhe nel server sql?

istruzione Case è qui sotto:

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 

quando l'eseguo ottengo il seguente errore:

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

+1

che SQL non ha senso. Puoi dare alcuni dati di esempio e mostrare cosa ti aspettavi che accadesse? –

+0

Questa è la SQL esatto: Selezionare data_source, CustomerID, CASO QUANDO data_source = 'Test1' e Len (CustomerName) = '35' Poi data_source = 'Test2' e substring (CustomerName, 1, 35) End AS CustomerName Da dbo.xx – user1368436

+0

Data_Source CustomerID CustomerName Test xxx xxx PLC, (LONDON BR Test1 xxx xxx PLC (LONDON BR2) – user1368436

risposta

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 

Aggiornamento la query

  1. uso '+' per stringa concat
  2. len() restituisce int, non c'è bisogno di usare ''
  3. remove "Column1 =" nel caso in cui condizioni
  4. sostituire "" con ''

Spero che questo aiuto.

+0

Ciao Seanbun, grazie per il tuo suggerimento Non sto cercando di concatenare alcun dato qui.La lunghezza è necessaria per manipolare i dati in modo che i valori di ritorno abbiano la stessa lunghezza. Sto cercando di capire perché il '=' sta causando un errore dopo il mio THEN o un suggerimento su come posso usare QUANDO per facilitare i record con lo stesso ID, variante Data Source per abbinare il ritorno lunghezza di uno specifico campo. – user1368436

+0

Sarebbe d'aiuto? come di seguito o potresti dichiarare una variabile @Result per memorizzare il tuo valore e tornare alla fine? 'Selezionare Column1, Column2, Caso Quando Colonna1 = 'Qualcosa' e Len (Column2) = 35 Poi 'qualcos'altro' + substring (Column2, 1, 35) \t ELSE Column1 End come Colonna3 Da dbo.xxx' – seanbun

2

È necessario avere un valore per ogni WHEN, e deve avere un 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() non restituisce una stringa.

EDIT: risposta Server Uno SQL che affronta alcuni dei commenti potrebbero essere:

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

La parte 'ELSE' non è obbligatoria in Transact-SQL CASE (se era ciò che intendevi per * dovrebbe *). –

+0

@AndriyM - È stato un suggerimento sulle "migliori pratiche". – HABO

+0

Non sto tentando di utilizzare più WHEN nella mia istruzione, l'intento è di manipolare i dati nei record in cui l'ID è simile ma l'origine dati (Column1) è variante, quindi la lunghezza restituita è la stessa. Naturalmente aggiungere ELSE è un libro di testo, ma non essere distratto da ciò che sto cercando di realizzare. Qualcuno sa perché otterrei quell'errore quando aggiungo il '=' dopo il mio THEN? O una soluzione che mi consenta di usare QUANDO in questo modo. Qualsiasi altro suggerimento è apprezzato. – user1368436

Problemi correlati