Rückgabeliste der Werte unter der Bedingung, dass Klausel
On November 30, 2020 by admin Ich versuche, eine Tabelle basierend auf einem Parameter zu filtern, der bestimmt, welche Werteliste für eine bestimmte Spalte zulässig ist Für @Parameter = 1
möchten wir, dass MyColumn
entweder FirstValue
oder ; für @Parameter = 2
soll MyColumn
entweder ThirdValue
oder sein FourthValue
; andernfalls möchten wir alle Werte von MyColumn
.
Diese Syntax funktioniert eindeutig nicht:
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 );
Was wäre der beste Weg, um dies zu erreichen?
Bearbeiten: Dies funktioniert, ist aber sehr klobig, daher würde ich gerne eine elegantere Lösung finden:
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;
Kommentare
- Was sollte in der Ergebnismenge enthalten sein?
- Ungefähr 10 Spalten aus
MyTable
Antwort
Sofern mir nichts fehlt, sieht dieses „ “ wie ein einfacher Fall von Kombinieren der UND- und ODER-Bedingungen
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 )
Das Äquivalent unter Verwendung einer CASE Ausdruck wäre
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
Kommentare
- Ihre Logik ist korrekt Ich denke, beide werden funktionieren. Ich ' werde mit dem ersten gehen, da dies in meinen Augen besser lesbar aussieht. Danke.
Antwort
Vielleicht könnte so etwas funktionieren:
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))
Schreibe einen Kommentar