Ich habe eine gespeicherte Prozedur, die Informationen aus einer Tabelle basierend auf 4 Parametern abruft.
Ich möchte Werte basierend auf den Parametern abrufen, aber wenn ein Parameter NULL ist, wird dieser Parameter nicht geprüft. Wenn also alle 4 Parameter null sind, würde ich die gesamte Tabelle anzeigen.
Dies ist mein SP (wie Sie sehen, funktioniert dies nur für 1 Parameter atm):
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
END
END
Gibt es eine Möglichkeit, dies ohne für jede mögliche Kombination (15 IFs) IF
zu machen?
Wie wäre es mit so etwas
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE @Param1+'%'
OR @Param1 IS NULL
in diesem speziellen Fall hätten Sie auch verwenden können
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE ISNULL(@Param1,'')+'%'
Aber im Allgemeinen kannst du so etwas versuchen
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE (condition1 OR @Param1 IS NULL)
AND (condition2 OR @Param2 IS NULL)
AND (condition3 OR @Param3 IS NULL)
...
AND (conditionN OR @ParamN IS NULL)
Wenn Sie meinen, @ param1 ist der Parameter für col1, ist @ param2 der Parameter für col2, ... etc Sie können dies versuchen:
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
(case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
then ''
else
'where '+
(case when @Param1 is not null
then ' col1 like '''[email protected]+'%'''+
(case when @param2 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param2 is not null
then ' col2 like '''[email protected]+'%'''+
(case when @param3 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param3 is not null
then ' col3 like '''[email protected]+'%'''+
(case when @param4 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param4 is not null
then ' col4 like '''[email protected]+'%'''
else '' end)
end)
exec sp_sqlexec @query
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
END
END
Das sollte helfen
grüße
Ashutosh Arya
Fügen Sie die Bedingung dort hinzu und verwenden Sie CASE .. WHEN .. THEN..
VERSUCHEN SIE, WEG ZU FOLGEN.
select col1,col2,...colN..from Table
Where clm1 = CASE WHEN @PARAMETER = 0 THEN **COL1** ELSE **@PARAMETER**
Sobald Sie denselben Spaltennamen eingeben, in dem die Bedingung dann alle Daten von TABLE ELSE BEREITET, WENN SIE ALS PARAMETER DURCHZIEHEN MÜSSEN, BEENDEN SIE DIE BASIS AUF BEDINGUNGSWERT VON TABLE.
Sie können die Funktion COALESCE()
im SQL-Server verwenden. Sie müssen in Ihren Anweisungen nicht IF- Else
oder CASE
verwenden. So können Sie COALESCE
function verwenden.
SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)
Die COALESCE
-Funktion in SQL gibt den ersten Nicht-NULL-Ausdruck unter ihren Argumenten zurück. Wenn zum Beispiel @param1 gleich null ist, gibt die Funktion col1 zurück, was zu col1 = col1 in der where-Anweisung führt, die wie 1 = 1 ist, was bedeutet, dass die Bedingung immer wahr ist.