我有一个包含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$;
答案 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。