2016-04-18 18 views
1

Ich möchte Zeile basierend auf Parameterwert abrufen. Entweder könnte es Wert 'ABC' oder NULL sein. Unten sind die Quelltabelle und das erwartete Ergebnis, die ich versuche zu erreichen.Get Zeile aus Tabelle basierend auf Parameter

Source

column1 column2 
-------------------------- 
    value1  NULL 
    value2  ABC 

mit Abfrage versucht, aber es ist zwei Reihen bekommen, die mit Wert1 und Wert2 sind.

Declare @Param1 varchar(20) = 'ABC' 

Select * 
from SourceTable 
where column2 = @Param1 Or column2 is NULL 

Wenn Wert 'ABC' dann Ergebnis -

column1 column2 
-------------------------- 
value2  ABC 

Wenn der Wert NULL ist dann Ergebnis -

column1 column2 
-------------------------- 
value1  NULL 

Antwort

1

Sie können versuchen, etwas wie: Nur Problem, das Sie möglicherweise mit diesem finden, wenn Ihre Spalte2 Leerzeichen hat.

SELECT * 
FROM SourceTable 
WHERE ISNULL(column2, '') = ISNULL(@Param1, '') 
+1

Vielleicht nichts hier kümmern , aber Sie könnten lesen über 'ISNULL()' und "Sargable" ... – Shnugo

+0

Ich würde sagen, dass SARGability immer etwas ist, worüber man sich sorgen muss. Diese Abfrage ist möglicherweise für die Leistung in Ordnung, aber jemand anderes wird mitkommen und es kopieren und nicht verstehen, warum die andere Abfrage so schrecklich langsam ist. Es ist leicht genug zu beheben, sobald Sie wissen, dass ein Problem vorliegt. :) –

4

Vielleicht wäre dies für Sie arbeiten?

0

Vielleicht möchten Sie union all und eine Prüfung auf Existenz:

Select * 
from SourceTable 
where column2 = @Param1 
union all 
Select * 
from SourceTable 
where column2 is null and not exists (select 1 from sourcetable st2 where st2.column2 = @Param1); 

Eine Alternative verwendet, um durch - wenn Sie nur eine Zeile wollen:

select top 1 st.* 
from sourcetable st 
where column2 = @param1 or column2 is null 
order by (case when column2 is not null then 1 else 2 end); 
Verwandte Themen