Articles
Devuelve la lista de valores en la cláusula where condicional
On noviembre 30, 2020 by admin Estoy tratando de filtrar una tabla en función de un parámetro que determina qué lista de valores están permitidos para una determinada columna . Para @Parameter = 1
queremos que MyColumn
sea FirstValue
o SecondValue
; para @Parameter = 2
queremos que MyColumn
sea ThirdValue
o FourthValue
; de lo contrario, queremos todos los valores de MyColumn
.
Esta sintaxis claramente no funciona:
declare @Parameter int = 1; -- can also be 2 or 3 select * from dbo.MyTable where MyColumn in ( case @Parameter when 1 then (N"FirstValue", N"SecondValue") when 2 then (N"ThirdValue", N"FourthValue") else (N"FirstValue", N"SecondValue", N"ThirdValue", N"FourthValue") end );
¿Cuál sería la mejor manera de lograrlo?
Editar: Esto funciona pero es muy torpe, así que me gustaría encontrar una solución más elegante:
select * from dbo.MyTable join ( values (1, N"FirstValue"), (1, N"SecondValue"), (2, N"ThirdValue"), (2, N"FourthValue"), (3, N"FirstValue"), (3, N"SecondValue"), (3, N"ThirdValue"), (3, N"FourthValue") ) as temp(Option, Value) on MyTable.MyColumn = temp.Value where temp.Option = @Parameter;
Comentarios
Respuesta
A menos que «me esté perdiendo algo, esto» parece «como un simple caso de Combinando las condiciones AND y OR
Declare @Parameter int = 1 declare @MyTable table(id int, MyColumn nvarchar(100)) insert into @MyTable values(1, N"FirstValue"), (1, N"SecondValue"), (2, N"ThirdValue"), (2, N"FourthValue"), (5, N"FifthValue") SELECT * FROM @MyTable WHERE ( @Parameter = 1 AND ( MyColumn = "FirstValue" OR MyColumn = "SecondValue" ) ) OR ( @Parameter = 2 AND ( MyColumn = "ThirdValue" OR MyColumn = "FourthValue" ) ) OR ( @Parameter <> 1 AND @Parameter <> 2 )
El equivalente usando un CASE sería
Declare @Parameter int = 3 declare @MyTable table(id int, MyColumn nvarchar(100)) insert into @MyTable values(1, N"FirstValue"), (1, N"SecondValue"), (2, N"ThirdValue"), (2, N"FourthValue"), (5, N"FifthValue") SELECT * FROM @MyTable WHERE "Y" = CASE WHEN @Parameter = 1 AND MyColumn IN ( N"FirstValue" ,N"SecondValue" ) THEN "Y" WHEN @Parameter = 2 AND MyColumn IN ( N"ThirdValue" ,N"FourthValue" ) THEN "Y" WHEN @Parameter NOT IN ( 1 ,2 ) THEN "Y" ELSE "N" END
Comentarios
- Tu lógica es correcta así que creo que ambos funcionarán. Yo ' elegiré el primero ya que se ve más legible a mis ojos. Gracias.
Responder
Quizás algo así podría funcionar:
declare @values table(id int, value nvarchar(100)) insert into @values values(1, N"FirstValue"), (1, N"SecondValue"), (2, N"ThirdValue"), (2, N"FourthValue") select * from dbo.MyTable t join @values v on t.MyColumn = v.value and (v.id = @Parameter or @Parameter not in (1,2))
MyTable