PDA

Ver la Versión Completa : like con parametros en plpgsql


puzzlemaniaco
25-10-2012, 07:23:26
que tal amigos pues veran tengo una tabla que tiene los resgistros
alez rodriguez
derek jeter
pablo sandoval
justin verlander

Ahora haga una función que recibe un parámetro que va a ser un x nombre a buscar

CREATE OR REPLACE FUNCTION escuela.seek_empleado(nom character varying)
nombre_completo_del_empleado like (nom||'%' ) <------ y hago mi like asi

si mando a llamar a la función
select seek_empleado('')

se supone no me debería regresar ningún registro, sin embargo me regresa todos los registros , que estoy haciendo como puedo hacer like('alex%') peor que en vez de alex sea una variable?

olbeup
25-10-2012, 09:04:53
que tal amigos pues veran tengo una tabla que tiene los resgistros
alez rodriguez
derek jeter
pablo sandoval
justin verlander

Ahora haga una función que recibe un parámetro que va a ser un x nombre a buscar

CREATE OR REPLACE FUNCTION escuela.seek_empleado(nom character varying)
nombre_completo_del_empleado like (nom||'%' ) <------ y hago mi like asi

si mando a llamar a la función
select seek_empleado('')

se supone no me debería regresar ningún registro, sin embargo me regresa todos los registros , que estoy haciendo como puedo hacer like('alex%') peor que en vez de alex sea una variable?

Hola puzzlemaniaco,

No entiendo de postgreSQL pero si cambias (nom||%) por (nom + '%')

Un saludo.

Casimiro Notevi
25-10-2012, 10:41:30
.

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)


Recuerda poner los tags al código fuente, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

roman
25-10-2012, 16:24:50
se supone no me debería regresar ningún registro, sin embargo me regresa todos los registros

Y ¿por qué supones eso? Te está regresando todos los registros porque al pasarle una cadena vacía como parámetro la comparación queda:


like '%'


es decir, cualquier nombre satisface la condición pues % coincide con culquier cosa.

// Saludos

gatosoft
25-10-2012, 16:42:44
De acuerdo con Roman,

Intenta algo como:

Where (campo like nom||'%' ) and (nom<>'')

olbeup
26-10-2012, 09:26:33
De acuerdo con Roman,

Intenta algo como:

Where (campo like nom||'%' ) and (nom<>'')


En éste caso no te saldrá nada porque estas poniendo otra condición (nom <> ''), siempre y cuando el "nom" este vacio, si tuviera alguna letra el "nom", entonces saldrá todos los empleado cuya letra empiece por "?", es decir si "nom" contiene el valor de "P" saldrán todos los empleado cuyo nombre empiecen por "P" ya que también (nom <> '')

Un saludo.

roman
26-10-2012, 16:44:06
es decir si "nom" contiene el valor de "P" saldrán todos los empleado cuyo nombre empiecen por "P" ya que también (nom <> '')


Pues, eso es lo que busca, ¿que no? :confused: Y si nom está vacio entonces la segunda condición no se cumple y no muestra ningún resultado, tal como se quiere.

// Saludos

puzzlemaniaco
05-11-2012, 05:24:40
antes que nada perdón por tardar en contestar no tuve computadora donde tenia guarda esta paina y por alguna razon no me llegaron las notificaciones de respuesta a otros equipos.

Segundo no entendi lo de guia de estilo , segun yo si habia indicado que era codigo.

Tercero ya leei sus sugerencias y pues mi problema era originado por una mala concatenación, lo resolví de la siguiente manera
like ($1||''||'%'); el $ es para indicarle a postgres que es un parámetro el 1 que es el primer parámetro || son para concatenar cadenas y % el operador propio del like.
Gracias por sus respuestas y saludos a todos los que se tomaron la molestia de leer y responder .

ToritoCapo
12-12-2012, 16:08:00
like ($1||''||'%'); el $ es para indicarle a postgres que es un parámetro el 1 que es el primer parámetro || son para concatenar cadenas y % el operador propio del like.
Gracias por sus respuestas y saludos a todos los que se tomaron la molestia de leer y responder .

Creo que el código tal como lo pusiste te va a traer todos los registros igual, lo único que hiciste es dejar un espacio en el medio. Te sugiero algo parecido a lo que pusieron anteriormente:
...where empleado like $1||'%' and $1<>'';
El '%' es un comodín que completa los caracteres, en este caso, al final de la cadena, si tenemos por ejemplo:

Pablo Rodriguez
Juan Pablo Gimenez
juan pablo diaz

Si buscamos a 'Pablo' con el código que puse, nos traería a "Pablo Rodriguez"

Si agregamos el comodín también adelante.
...where empleado like '%'||$1||'%' and $1<>'';
Y buscamos ahora a 'Pablo' el código anterior nos traería "Pablo Rodriguez" y "Juan Pablo Gimenez"

Por último si en lugar de "like" usamos "ilike" la busqueda se realiza tanto en mayúsculas como en minúsculas.
...where empleado ilike '%'||$1||'%' and $1<>'';
Y buscamos nuevamente a 'Pablo' el código anterior nos traería "Pablo Rodriguez", "Juan Pablo Gimenez"
y juan pablo diaz.


Es mi primer aporte al foro!!!!:D:D, las anteriores fueron consultas.
Que dirán los grandes expertos v:-)v espero que les guste.

Saludos.

gatosoft
25-01-2013, 16:22:13
Que dirán los grandes expertos v:-)v espero que les guste.

:cool: ejem... Pues a mi me gusta, (cof, cof) jejejejejejejejeje... :cool:

Muy bien explicado, que buen aporte...!!!

Casimiro Notevi
03-08-2016, 20:13:09
http://www.clubdelphi.com/foros/guiaestilo.php