2012-05-01 9 views
5

Estoy tratando de usar CASE en una declaración SQL Select que me permitirá obtener resultados donde puedo utilizar la longitud de una cadena para producir los resutls de otra cadena. Se trata de registros no coincidentes de dos conjuntos de datos que comparten una ID común, pero una fuente de datos variantes.Usando Case para hacer coincidir cadenas en el servidor sql?

instrucción Case es el siguiente:

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 

Cuando lo ejecuto me sale el siguiente error:

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

+1

que SQL no tiene sentido. ¿Puedes dar algunos datos de ejemplo y mostrar lo que esperabas que sucediera? –

+0

Este es el sql exacta: Seleccionar data_source, CustomerID, CASE CUANDO data_source = 'Test1' y Len (CustomerName) = '35' Entonces data_source = 'Test2' y subcadena (CustomerName, 1, 35) End AS CustomerName De dbo.xx – user1368436

+0

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

Respuesta

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 

actualización de su consulta en

  1. uso '+' para cadena concat
  2. len() devuelve int, no hay necesidad de utilizar ''
  3. remove "Columna1 =" en el caso cuando la condición
  4. reemplazar "" con ''

Esperanza esta ayuda.

+0

Hola Seanbun, gracias por su sugerencia. No estoy buscando concatenar ningún dato aquí. Se necesita longitud para manipular los datos para que los valores de retorno tengan la misma longitud. Estoy buscando entender por qué el '=' está causando un error después de mi ENTONCES o una sugerencia de cómo puedo usar CUÁNDO para facilitar los registros con el mismo ID, fuente de datos variante para que coincida con longitud de retorno de un específico campo. – user1368436

+0

¿Ayudaría 'Else'? como a continuación o podría declarar una variable @Result para almacenar su valor y devolverlo al final? 'Select Columna1, Columna2, Caso Cuando la columna 1 = 'Algo' y Len (columna 2) = 35 Entonces 'algo más' + subcadena (columna 2, 1, 35) \t ELSE Columna1 End como Columna3 Desde dbo.xxx' – seanbun

2

Usted necesita tener un valor para cada WHEN, y debe tener 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() no devuelve una cadena.

EDIT: respuesta Servidor A SQL que aborda algunos de los comentarios pueden ser:

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' no es obligatoria en CASE de Transact-SQL (si eso era lo que quería decir con * debe *). –

+0

@AndriyM: fue una sugerencia de "mejores prácticas". – HABO

+0

No estoy tratando de usar WHEN múltiple en mi declaración, la intención es manipular datos en registros donde la ID es similar pero la fuente de datos (Columna1) es variante por lo que la longitud devuelta es la misma. Por supuesto, agregar ELSE es un libro de texto, pero no distraerse de lo que intento lograr. ¿Alguien sabe por qué me daría ese error al agregar el '=' después de mi ENTONCES? O una solución que proporciona eso me permite usar CUÁNDO de esta manera. Cualquier otra sugerencia es apreciada. – user1368436

Cuestiones relacionadas