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

LIKE en sql dinámico, PLPGSQL

Estas en el tema de LIKE en sql dinámico, PLPGSQL en el foro de PostgreSQL en Foros del Web. Holas, Bueno de nuevo por estos lados para preguntar por un tema en específico, necesito hacer una comparación de texto en una función plpgsql, la ...
  #1 (permalink)  
Antiguo 07/12/2009, 13:40
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 20 años, 3 meses
Puntos: 2
LIKE en sql dinámico, PLPGSQL

Holas,

Bueno de nuevo por estos lados para preguntar por un tema en específico, necesito hacer una comparación de texto en una función plpgsql, la comparación es con LIKE ya que el campo no tiene mucha importancia pero aún así hay que considerarlo.

El tema es que creo la consulta dinámicamente y luego la ejecuto con EXECUTE y no sé cómo hacer para meter el LIKE dentro de la consulta para que lo tome el EXECUTE

Considerando lo siguiente:

Código PLPGSQL:
Ver original
  1. ...
  2. sql  = sql || ' WHERE columna LIKE %$1%';
  3. ...
  4.  
  5. FOR datos IN EXECUTE sql USING texto_a_buscar LOOP
  6. ...

Claramente eso no funciona, ¿Sabe alguien cómo hacerlo?

Lo otro que he notado es que al comparar con igualdad una columna con un texto, la comparación es Case Sensitive, en otras palabras si uso:

...WHERE columna=$1

Debo poner el valor de la columna con el mismo formato de mayúsculas y minúsculas o no lo encuentra. ¿Será alguna configuración de la BD que tengo mal seteada?

Saludos y muchas gracias
  #2 (permalink)  
Antiguo 07/12/2009, 14:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: LIKE en sql dinámico, PLPGSQL

No tengo como probar, pero creo que no estas concatenando bien los campos.

Mira este post donde explico un tema similar.

Con respecto a la comparación case sensitive, utiliza ilike (insensitive like) en vez de like.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 07/12/2009, 14:45
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 20 años, 3 meses
Puntos: 2
Respuesta: LIKE en sql dinámico, PLPGSQL

Gracias por la respuesta Huesos,

Para probar tu ejemplo cree una variable auxiliar para enviar el comodin y seguir la sintaxis al pie de la letra, sin embargo no obtengo ningun resultado

Código PLPGSQL:
Ver original
  1. auxLike = '$9';
  2. sql = sql || ' AND columna ILIKE ''%' || ltrim(rtrim(auxLike)) || '%''';
  3.  
  4. FOR datos IN EXECUTE sql USING texto LOOP...

El problema debe ocurrir al pasar la sentencia sql como texto al EXECUTE, algo por ese lado no anda.

Gracias por la ayuda, sigo investigando
  #4 (permalink)  
Antiguo 07/12/2009, 15:05
Avatar de xdrtas  
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 16 años, 5 meses
Puntos: 13
Respuesta: LIKE en sql dinámico, PLPGSQL

Hola rProgged, tu tienes auxLike= '$9' prueba quitando las comillas simples, así: auxLike = $9
Porque las comillas simples ya las tienes en la cadena de texto de la variable sql.

Suerte y espero que te sirva.
__________________
¿Cuál es el mejor lenguaje para programar?
Aquel lenguaje por el cual te paguen más.
[--::xdrtas.coolpage.biz::--]
[---:::xdrtas:::---]
  #5 (permalink)  
Antiguo 08/12/2009, 17:37
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: LIKE en sql dinámico, PLPGSQL

Es cierto.

Si la variable de entrada es text, varchar, date o timestamp (O un tipo de dato que requiera comillas) ya las trae implicitas dentro de la variable.

Pruebalo y nos cuentas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 09/12/2009, 08:20
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 20 años, 3 meses
Puntos: 2
Respuesta: LIKE en sql dinámico, PLPGSQL

Hola,

Ya he solucionado el problema. El tema es que al parecer el execute agrega las comillas cuando detecta que un parametro las requiere.

Por ejemplo:

Si pasamos el texto "juan" para buscar, al ocupar

sql = sql || ' AND columna ILIKE ''%' || ltrim(rtrim($1)) || '%''';

Se traduce en ...AND columna ILIKE '%'juan'%'

O por lo menos eso creo. No estoy muy seguro acerca de esto porque según yo debería arrojar un error en la consulta, pero quizás execute capture el error y por eso no lo muestra


En fin, el tema se soluciona al preprocesar el parametro. Concretamente:

auxParam = '%' || parametro || '%';

sql = sql || ' AND columna ILIKE $1';

FOR datos IN EXECUTE sql USING auxParam LOOP...

y eso seria todo. Ahora funciona OK

Bueno si alguien puede aclarar eso de los parámetros en el execute, mejor aún :)

Saludos y gracias
  #7 (permalink)  
Antiguo 09/12/2009, 08:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: LIKE en sql dinámico, PLPGSQL

La explicación es básicamente lo que te decimos en los 2 post anteriores rprogged.

El gran problema con el execute, es que debe ser encerrado en comillas simples y esto confunde las sentencias que requieren un parámetro tipo varchar o similares que requieren nuevamente comillas.

La comilla de apertura de la variable, postgresql la toma como cierre de la sentencia del execute. Por eso se requieren tantas comillas de mas, para que postgresql las entienda como debe ser.

Para estos campos, siempre me creo una función aparte que me retorne como texto toda la estructura del execute y poder determinar en que parte tengo errores y como los debo solucionar.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 21:19.