PostgreSQL - el argumento de AND debe ser de tipo boolean,

 
Vista:
Imágen de perfil de miguel angel
Val: 1
Ha disminuido su posición en 20 puestos en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

el argumento de AND debe ser de tipo boolean,

Publicado por miguel angel (1 intervención) el 06/08/2019 01:44:21
de antemano muchas gracias por la ayuda que me puedan brindar el tema es el siguiente:
estoy realizando una función en postgres la cuan en donde retorno una consulta y esta recibe como parámetro 3 condiciones que sera las condiciones de dicha consulta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
CREATE OR REPLACE FUNCTION pagos.f_reporteingresos (
IN p_fechaIncio character varying,
IN p_fechaFin character varying,
IN p_condicion1 character varying,
IN p_condicion2 character varying,
IN p_condicion3 character varying
)
RETURNS TABLE (
"CAMPO" character varying,
"IMPUESTO" numeric(14,2),
"ADICIONAL" numeric(14,2),
"MULTA" numeric(14,2),
"RECARGO" numeric(14,2),
"GASTOS" numeric (14,2),
"INGRESOS" numeric(14,2),
"DESCUENTO" numeric(14,2),
pred_count bigint ) AS
$BODY$ DECLARE
BEGIN RETURN QUERY
select campo,
 case when campo='IMPUESTO' THEN sum(monto) ELSE SUM(0) END IMPUESTO,
 case when campo='ADICIONAL' THEN sum(monto) ELSE SUM(0) END ADICIONAL,
 case when campo='MULTA' THEN sum(monto) ELSE SUM(0) END MULTA,
 case when campo='RECARGO' THEN sum(monto) ELSE SUM(0) END RECARGO,
 case when campo IN ('GASTOS','HONORA') THEN sum(monto) ELSE SUM(0) END GASTOS,
 case when campo IN ('IMPUESTO','ADICIONAL','MULTA','RECARGO','GASTOS','HONORA') THEN sum(monto) ELSE SUM(0) END INGRESO,
 case when campo IN ( 'A_MAYORES' ,'SUBSIDIO', 'CANT_C','PENSION')THEN sum(monto) ELSE SUM(0) END DESCUENTO,
 case when campo = 'IMPUESTO' THEN COUNT(A.TIPO_PREDIO) ELSE 0 END PRED_COUNT
 FROM (
       SELECT "substring"(pcc.num_cuenta_contable::text, 1, 4)::numeric AS cuenta_id,
              "substring"(pcc.num_cuenta_contable::text, 5, 4)::numeric AS subcuenta_id,
              "substring"(pcc.num_cuenta_contable::text, 9, 5)::numeric AS ssubcuenta_id,
              "substring"(pcc.num_cuenta_contable::text, 14, 4)::numeric AS sssubcuenta_id,
              ecpc.id_pago, ecpc.id_recibo, ecpc.id_control_int, ecpc.id_cuenta, erp.e_fecha_pago,
              erp.estatus, pcc.num_cuenta_contable, pcc.desc_cuenta_contable AS desc_cta_arbitrio,
        CASE
            WHEN pcc.campo::text = ANY (ARRAY['SUBSIDIO'::character varying::text,
            'PENSION'::character varying::text, 'A_MAYORES'::character varying::text,
            'CANT_C'::character varying::text, 'DESC_SERV'::character varying::text,
            'DESCUENTO'::character varying::text])
            THEN (ecpc.monto * (-1)::numeric)::numeric(18,2)
            ELSE ecpc.monto END AS monto, pcc.id_concepto_pred, pcc.tipo_predio, csc.descripcion AS desc_cuenta_contable
   		FROM pagos.e_concentrado_predial_contable ecpc
   		JOIN pagos.e_recibos_predial erp ON ecpc.id_pago = erp.id_pago AND ecpc.id_recibo = erp.id_recibo
   		JOIN pagos.cat_cuentas_contables pcc ON pcc.id_cuenta = ecpc.id_cuenta
   		JOIN pagos.cat_ssubcuenta csc ON pcc.cve_ssubcuenta = csc.cve_ssubcuenta AND pcc.cve_subcuenta = csc.cve_subcuenta AND pcc.cve_cuenta = csc.cve_cuenta
  		WHERE erp.estatus::text = 'P'::text
 		ORDER BY "substring"(pcc.num_cuenta_contable::text, 1, 4)::numeric,
 		         "substring"(pcc.num_cuenta_contable::text, 5, 4)::numeric,
 		         "substring"(pcc.num_cuenta_contable::text, 9, 5)::numeric,
 		         erp.e_fecha_pago
     ) a
 LEFT JOIN pagos.cat_cuentas_contables b  on a.id_cuenta=b.id_cuenta
 WHERE p_condicion1
 AND p_condicion2
 AND p_condicion3
 AND date_trunc('day',A.E_FECHA_PAGO) BETWEEN date_trunc('day', TO_DATE(p_fechaIncio,'DD/MM/YYYY'))
 AND date_trunc('day', TO_DATE(p_fechaFin,'DD/MM/YYYY'))
 group by campo;

el asunto que al mandar a llamar la función me retorna el siguiente mensaje :
ERROR: el argumento de AND debe ser de tipo boolean, no tipo character varying
aun no tengo mucha experiencia con base de datos , espero que alguien me pueda orientar con esto
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

el argumento de AND debe ser de tipo boolean,

Publicado por Francisco (110 intervenciones) el 17/08/2019 16:52:06
Hola

El problema esta aqui

1
2
3
WHERE p_condicion1
 AND p_condicion2
 AND p_condicion3

SQL no puede interpretar condiciones cuando estan en VARCHAR para eso tienes que tomar toda la sentencia y convertirla a texto es decir ejecutar una sentencia dinamicamente

1
EXECUTE 'SELECT ... FROM .... WHERE  $1 AND $2 AND  $3.....' USING p_condicion1, p_condicion2_p_condicion3;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar