web-dev-qa-db-ger.com

SQL ignoriert einen Teil von WHERE, wenn der Parameter null ist

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?

17

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)
32
Adriaan Stander

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
3
Fauzi88
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

2
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.

0
Mayur

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 COALESCEfunction 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.

0
Aamir