Как я могу использовать SQL, где предложение с несколькими параметрами - PullRequest
0 голосов
/ 01 января 2019

У меня есть TABLE с 9 полями, и я создал отчет в Ireport с 9 параметрами из этого TABLE, но иногда пользователи заполняют некоторые параметры, а не все.Итак, насколько вы знаете, я должен проверить их все друг с другом.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 голосов
/ 01 января 2019

Вы можете использовать специфичные для базы данных функции NVL (NVL в ORACLE, IFNULL в MYSQL, COALESCE в POSTGRESQL и т. Д.) В сочетании со столбцом в таблице.

Пример:

Предположим, что 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)
0 голосов
/ 01 января 2019

вы можете использовать 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 возвращает нольесли все столбцы являются нулевыми и возвращает значение, если какой-либо / некоторые / все они не равны нулю.

0 голосов
/ 01 января 2019

Это можно записать в виде одного запроса, например:

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)
          ...
0 голосов
/ 01 января 2019

Я выполнил ваше требование и решил, что вы можете использовать функцию COALESCE вместо множества блоков if else.это то же самое, что NVL в Oracle.Ниже я пишу пример запроса, который вы можете использовать в своей функции.

COALESCE (parcol1_par, t.parcol1, parcol1_par) - если parcol1_par равен нулю, он будет сравниваться с исходным значением столбца parcol1 , если он не равен нулю, то он будет сравниваться с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...