如何使用带有多个参数的SQL where子句

时间:2019-01-01 14:11:07

标签: sql postgresql

我有一个包含9个字段的TABLE,我在Ireport中使用此TABLE的9个参数创建了一个报表,但有时用户会填充一些参数,而不是全部。 所以,据你所知我应该互相检查。 IF is null执行此操作,IF is not null执行此操作。 所以,请帮忙告诉我如何处理?

+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_5 | Col_6 | Col_7 | Col_8 | Col_9 |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| x     | y     | 3o    | xT    | y1    | k32   | xY    | L     | 3q    |
| s     | u     | 4t    | xO    | y3    | j34   | xO    | K     | 2a    |
| h     | z     | 33r   | xH    | y3    | h36   | xT    | y     | 6s    |
| t     | t     | 14r   | xF    | y5    | t31   | xP    | J     | 1d    |
| m     | m     | 77w   | xS    | y7    | o30   | xJ    | O     | 0f    |
+-------+-------+-------+-------+-------+-------+-------+-------+-------+

我的查询是这个

CREATE FUNCTION public.rep_staff(
    parCol1 text,
    parCol2 text,
    parCol3 text,
    parCol4 text,
    parCol5 text,
    parCol6 text,
    parCol7 text,
    parCol8 text,
    parCol9 text,
    OUT Col_1 character varying,
    OUT Col_2 character varying,
    OUT Col_3 character varying,
    OUT Col_4 character varying,
    OUT Col_5 character varying,
    OUT Col_6 character varying,
    OUT Col_7 character varying,
    OUT Col_8 character varying,
    OUT Col_9 character varying)
RETURNS SETOF record 
    LANGUAGE 'plpgsql'
AS $BODY$

DECLARE
    parCol1_par text;
    parCol2_par text;
    parCol3_par text;
    parCol4_par text;
    parCol5_par text;
    parCol6_par text;
    parCol7_par text;
    parCol8_par text;
    parCol9_par text;
BEGIN
    parCol1_par = parCol1 ;
    parCol2_par = parCol2 ;
    parCol3_par = parCol3 ;
    parCol4_par = parCol4 ;
    parCol5_par = parCol5 ;
    parCol6_par = parCol6 ;
    parCol7_par = parCol7 ;
    parCol8_par = parCol8 ;
    parCol9_par = parCol9 ;

    IF ( parCol1_par is NOT  null AND 
             parCol2_par is NOT  null AND 
             parCol3_par is NOT  null AND 
             parCol4_par is NOT  null AND 
             parCol5_par is NOT  null AND 
             parCol6_par is NOT  null AND 
             parCol7_par is NOT  null AND 
             parCol8_par is NOT  null AND 
             parCol9_par is NOT null)
        THEN
            RETURN QUERY
            SELECT
                *
            FROM
                "public"."TABLE" T
            WHERE T.parCol1 = parCol1_par AND
                  T.parCol2 = parCol2_par AND
                  T.parCol3 = parCol3_par AND
                  T.parCol4 = parCol4_par AND
                  T.parCol5 = parCol5_par AND
                  T.parCol6 = parCol6_par AND
                  T.parCol7 = parCol7_par AND
                  T.parCol8 = parCol8_par AND
                  T.parCol9 = parCol9_par;

        ELSE IF ( parCol1_par is null AND 
             parCol2_par is NOT  null AND 
             parCol3_par is NOT  null AND 
             parCol4_par is NOT  null AND 
             parCol5_par is NOT  null AND 
             parCol6_par is NOT  null AND 
             parCol7_par is NOT  null AND 
             parCol8_par is NOT  null AND 
             parCol9_par is NOT null)
        THEN
            RETURN QUERY
            SELECT
                *
            FROM
                "public"."TABLE" T
            WHERE T.parCol2 = parCol2_par AND
                  T.parCol3 = parCol3_par AND
                  T.parCol4 = parCol4_par AND
                  T.parCol5 = parCol5_par AND
                  T.parCol6 = parCol6_par AND
                  T.parCol7 = parCol7_par AND
                  T.parCol8 = parCol8_par AND
                  T.parCol9 = parCol9_par;

        ELSE IF (
                  .
                  .
                  .
                  .
                  .
                  .
                  .
        ELSE IF (
        ELSE IF (
        ELSE IF (

        END IF;
END

$BODY$;

4 个答案:

答案 0 :(得分:3)

您可以使用tha表中的wit列结合数据库特定的NVL函数(ORACLE中的NVL,MYSQL中的IFNULL,POSTGRESQL中的COALESCE等)。

示例:

我们的姿势parCol1_par为NULL。

条件(在POSTGRESQL中):

COALESCE(parCol1_par,T.parCol1)=T.parCol1

因此,整个整合过程可能是

SELECT *
FROM
"public"."TABLE" T
WHERE T.parCol1 = COALESCE(parCol1_par, T.parCol1)
AND T.parCol2 = COALESCE(parCol2_par, T.parCol2) 
AND T.parCol3 = COALESCE(parCol3_par, T.parCol3) 
AND T.parCol4 = COALESCE(parCol4_par, T.parCol4) 
AND T.parCol5 = COALESCE(parCol5_par, T.parCol5) 
AND T.parCol6 = COALESCE(parCol6_par, T.parCol6) 
AND T.parCol7 = COALESCE(parCol7_par, T.parCol7) 
AND T.parCol8 = COALESCE(parCol8_par, T.parCol8) 
AND T.parCol9 = COALESCE(parCol9_par, T.parCol9)

答案 1 :(得分:0)

这可以写为单个查询,例如:

SELECT
 *
FROM
    "public"."TABLE" T
WHERE 
    (parCol1_par IS NULL OR T.parCol1 = parCol1_par)
    AND (parCol2_par IS NULL OR T.parCol2 = parCol2_par)
          ...

另一种选择是使用COALESCE,它产生的语法较短,尽管效率可能较低:

SELECT
 *
FROM
    "public"."TABLE" T
WHERE 
    T.parCol1 = COALESCE(parCol1_par, T.parCol1) 
    AND T.parCol2 = COALESCE(parCol2_par, T.parCol2)
          ...

答案 2 :(得分:-1)

我满足了您的要求,尽管您可以使用COALESCE函数而不是那么多的if else块。与oracle中的NVL相同。我在下面编写一个示例查询,您可以在函数中使用它。

COALESCE(parcol1_par,t.parcol1,parcol1_par)-如果parcol1_par为null,则它将与 parcol1 列的原始值进行比较,如果不为null,则它将与 parcol1_par 值。

SELECT
    *
FROM
    "public"."TABLE" t
WHERE
    t.parcol1 = COALESCE(parcol1_par,t.parcol1,parcol1_par)
    AND t.parcol2 = COALESCE(parcol2_par,t.parcol2,parcol2_par)
    AND t.parcol3 = COALESCE(parcol3_par,t.parcol3,parcol3_par)
    AND t.parcol4 = COALESCE(parcol4_par,t.parcol4,parcol4_par)
    AND t.parcol5 = COALESCE(parcol5_par,t.parcol5,parcol5_par)
    AND t.parcol6 = COALESCE(parcol6_par,t.parcol6,parcol6_par)
    AND t.parcol7 = COALESCE(parcol7_par,t.parcol7,parcol7_par)
    AND t.parcol8 = COALESCE(parcol8_par,t.parcol8,parcol8_par)
    AND t.parcol9 = COALESCE(parcol9_par,t.parcol9,parcol9_par);

答案 3 :(得分:-1)

如果列为空,则可以使用COALESCE为列提供默认值,

COALESCE(parcol2, '')

或者甚至可以在内部使用它

IF COALESCE(parCol1_par, parCol2_par , parCol3_par , parCol4_par , 
            parCol5_par , parCol6_par , parCol7_par , parCol8_par ,
            parCol9_par ) IS NOT NULL THEN
....
END;

如果所有列都为空,则上述IF返回null;如果其中的某些/全部/全部不为空,则返回value。