2012-05-01 17 views
5

Próbuję użyć CASE w instrukcji SQL Select, która pozwoli mi uzyskać wyniki, w których mogę wykorzystać długość jednego ciągu, aby utworzyć ponowne zrzuty innego ciągu. Dotyczy to nie dopasowanych rekordów z dwóch zestawów danych, które mają wspólny identyfikator, ale wariant źródła danych.Używanie Case do dopasowywania ciągów na serwerze sql?

case jest poniżej:

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 

Kiedy uruchomić go pojawia się następujący błąd:

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

+1

że SQL nie ma sensu. Czy możesz podać przykładowe dane i pokazać, czego oczekiwałeś? –

+0

To jest dokładnie sql: Wybierz DATA_SOURCE, CustomerID, CASE KIEDY DATA_SOURCE = 'test1' i Len (CustomerName) = '35' Następnie DATA_SOURCE = 'Test2' i podciąg (CustomerName, 1, 35) koniec, jak CustomerName Od dbo.xx – user1368436

+0

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

Odpowiedz

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 

Aktualizacja zapytanie na

  1. użytku '+' dla ciąg konkat
  2. len() zwraca int, bez potrzeby korzystania z ''
  3. usunięcie "COLUMN1 =" w przypadku, gdy stan
  4. zastąpić "" z ''

nadzieję, że ta pomoc.

+0

Witam Seanbun, dziękuję za twoją sugestię Nie szukam tutaj żadnych danych. Długość jest wymagana do manipulowania dane w taki sposób, że zwracane wartości są tej samej długości.Proszę zrozumieć, dlaczego "=" powoduje błąd po moim THEN lub sugestię, w jaki sposób mogę użyć GDY, aby ułatwić zapisy o tym samym ID, wariant źródła danych, aby dopasować Zwróć długość konkretnej pole. – user1368436

+0

Czy "Else" pomoże? jak poniżej czy mógłbyś zadeklarować zmienną @Result do przechowywania wartości i powrotu na końcu? 'Wybierz COLUMN1, Kolumna2, Case Kiedy Kolumna1 = 'coś' i Len (Kolumna2) = 35 Then 'Something Else' + podciąg (Kolumna2, 1, 35) \t ELSE Kolumna1 End jako kolumna3 Od dbo.xxx' – seanbun

2

Trzeba mieć wartość dla każdego WHEN, i powinien mieć 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() nie zwraca ciąg znaków.

EDIT: SQL Server odpowiedź, która rozwiązuje niektóre komentarze mogą być:

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

Część "ELSE" nie jest obowiązkowa w przypadku Transact-SQL CASE (jeśli to właśnie miałeś na myśli * powinien *). –

+0

@AndriyM - To była sugestia "najlepszych praktyk". – HABO

+0

Nie próbuję używać wielu WHEN w moim oświadczeniu, intencją jest manipulowanie danymi w rekordach, w których identyfikator jest podobny, ale źródło danych (kolumna1) jest wariantem, więc zwrócona długość jest taka sama. Oczywiście dodanie ELSE to podręcznik, ale nie rozpraszać się temu, co próbuję osiągnąć. Czy ktoś wie, dlaczego dostałbym ten błąd podczas dodawania "=" po moim THEN? Lub rozwiązanie, które zapewnia, że ​​pozwala mi używać KIEDY w ten sposób. Wszelkie inne sugestie są mile widziane. – user1368436

Powiązane problemy