Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

comparacion de cadenas

Estas en el tema de comparacion de cadenas en el foro de PostgreSQL en Foros del Web. Hola a todos de nuevo por aqui huesos tu me ayudaste a resolver el problema de la seleccion con el where el problema era la ...
  #1 (permalink)  
Antiguo 13/08/2009, 14:17
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años
Puntos: 1
comparacion de cadenas

Hola a todos de nuevo por aqui huesos tu me ayudaste a resolver el problema de la seleccion con el where el problema era la forma en que estaba comparando, ahora el prblema es que uso esa misma forma de comparar para dos cadenas y no me hace la compracion les coloco la funcion que hace la comparacion


CREATE OR REPLACE FUNCTION inf_concepto_nombre(nombre_concepto varchar)
RETURNS SETOF conceptos AS
$BODY$
DECLARE

fila conceptos%rowtype;
sql character varying;
BEGIN
sql = 'SELECT id_sede,id_concepto,concepto,clase,tipo,status_con venio,afecta_prestaciones,afecta_utilidades,afecta _vacaciones,unidad,formula,afecta_liquidacion,afec ta_sueldomensual,ingreso_mensual,vigente,asociado, descripcion FROM conceptos WHERE concepto = '|| ltrim(rtrim(nombre_concepto));

FOR fila IN EXECUTE sql
LOOP
RETURN NEXT fila;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION inf_concepto_nombre(nombre_concepto varchar) OWNER TO postgres;



y cuando lo ejecuto :select * from inf_concepto_nombre('Pago de vacaciones');
me da el siguiente error :
ERROR: syntax error at or near "de" en el carácter 258
QUERY: SELECT id_sede,id_concepto,concepto,clase,tipo,status_con venio,afecta_prestaciones,afecta_utilidades,afecta _vacaciones,unidad,formula,afecta_liquidacion,afec ta_sueldomensual,ingreso_mensual,vigente,asociado, descripcion FROM conceptos WHERE concepto = Pago de vacaciones
CONTEXT: PL/pgSQL function "inf_concepto_nombre" line 8 at for over execute statement

que creen que pueda ser?????
  #2 (permalink)  
Antiguo 13/08/2009, 16:50
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 10 meses
Puntos: 43
Respuesta: comparacion de cadenas

Hola, para este caso puedes usar el quote_literal:


sql = 'SELECT id_sede,id_concepto,concepto,clase,tipo,status_con venio,afecta_prestaciones,afecta_utilidades,afecta _vacaciones,unidad,formula,afecta_liquidacion,afec ta_sueldomensual,ingreso_mensual,vigente,asociado, descripcion FROM conceptos WHERE concepto = '|| quote_literal(ltrim(rtrim(nombre_concepto)));

Cuentanos como te va!
  #3 (permalink)  
Antiguo 13/08/2009, 17:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: comparacion de cadenas

Excelente aporte chicohot20.
Esta función ayuda a controlar el uso indiscriminado de comillas sencillas para la ejecución de sentencias. Internamente está haciendo bien la concatenación de comilla simple con comilla simple. ''.

la sentencia internamente está haciendo esto:

Código sql:
Ver original
  1. SQL = 'SELECT id_sede,id_concepto,concepto,clase,tipo,
  2. status_con venio,afecta_prestaciones,afecta_utilidades,
  3. afecta _vacaciones,unidad,formula,afecta_liquidacion,afec ta_sueldomensual,
  4. ingreso_mensual,vigente,asociado, descripcion FROM conceptos
  5. WHERE concepto = ''' || ltrim(rtrim(nombre_concepto)) || '''';


saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 14/08/2009, 09:35
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años
Puntos: 1
Respuesta: comparacion de cadenas

Hola muchachos de verdad que muchas graaaaaaaaaaaaaaaacias ahora si me trae el registro que le especifico con cualquiera de las dos instrucciones que ustedes me dieron....
Ahora otra pregunta y aprovechando lo de las cadenas saben que tambien deberia de traerme los registros con solo colocar parte de la cadena ejemplo
select * from inf_concepto_nombre('Pago ');
y con esta tambien me deberia traer el registro que tenga esa subcadena....Lo que hice fue cambiar el = por el like pero no me trae nada estas dos sentencias deberian traerme lo mismo
select * from inf_concepto_nombre('Pago ');
select * from inf_concepto_nombre('Pago de vacaciones');
Gracias
  #5 (permalink)  
Antiguo 14/08/2009, 10:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: comparacion de cadenas

No tengo como probarlo chimaria, pero revisa bien la apertura de las comilla y donde ubicar los operadores %% para que respete la busqueda de parte de la culumna.


FROM conceptos WHERE concepto like ''%' || ltrim(rtrim(nombre_concepto)) || '%''';

Te recomendaría acomodar los comodines %% haciendo uso de la función quote_literal como te recomienda chicohot20. Es mucho mas elegante.

Nos cuentas como te va.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 14/08/2009, 10:46
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años
Puntos: 1
Respuesta: comparacion de cadenas

Hola huesos asi mismo era que bien muchas gracias.....
Cualquier cosa los sigo molestando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:24.