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

[SOLUCIONADO] Algo pasa con los WHERE cuando llevan LIKE '%%' ?

Estas en el tema de Algo pasa con los WHERE cuando llevan LIKE '%%' ? en el foro de SQL Server en Foros del Web. Hola Tengo este select donde busco jugadores por ciertas caracteristicas, ejemplo: Nombre, Apellidos, etc. Cita: SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook FROM PLAYER ...
  #1 (permalink)  
Antiguo 07/11/2013, 10:25
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
Pregunta Algo pasa con los WHERE cuando llevan LIKE '%%' ?

Hola

Tengo este select donde busco jugadores por ciertas caracteristicas, ejemplo: Nombre, Apellidos, etc.
Cita:
SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
FROM PLAYER
WHERE Player LIKE '%%' AND Name LIKE '%test%' AND
LastName LIKE '%%' AND Email LIKE '%%' AND
Password LIKE '%%' AND Phone LIKE '%%' AND
Zip LIKE '%%' AND Status = 'D'
Este select me retorna: 635 rows.

Luego tengo esta otra consulta que es basicamente la misma pero a diferencia de la anterior es que solo coloco los Like a los campos que si tienen datos a buscar:
Cita:
SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
FROM PLAYER
where Name like '%test%' and Status='D'
Esta me retorna 1509 rows

Entonces mi consulta es... Existe algun problema en dejar los likes vacios osea LIKE '%%' y si existe pues habra alguna solucion al respecto ?
  #2 (permalink)  
Antiguo 07/11/2013, 10:37
Avatar de adryan310  
Fecha de Ingreso: septiembre-2012
Mensajes: 450
Antigüedad: 11 años, 8 meses
Puntos: 3
De acuerdo Respuesta: Algo pasa con los WHERE cuando llevan LIKE '%%' ?

Por si a alguien le pasa se soluciono asi:
Cita:
SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
FROM PLAYER
WHERE ISNULL([PLAYER].[Player], '') LIKE '%%' AND ISNULL([PLAYER].[Name], '') LIKE '%test%' AND
ISNULL([PLAYER].[LastName], '') LIKE '%%' AND ISNULL([PLAYER].[Email], '') LIKE '%%' AND
ISNULL([PLAYER].[Password], '') LIKE '%%' AND ISNULL([PLAYER].[Phone], '') LIKE '%%' AND
ISNULL([PLAYER].[Zip], '') LIKE '%%' AND Status = 'D'
  #3 (permalink)  
Antiguo 07/11/2013, 10:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Algo pasa con los WHERE cuando llevan LIKE '%%' ?

En primer lugar, usar un comodin de ambosl lados es una muy mala idea. Eso le indica al DBMS que busque lo que comience con cualquier cosa y lo que termine con cualquiier cosa, y eso es algo que sólo se puede resolver leyendo toda la tabla.
Este tipo de condiciones se debe evitar porque no sólo genra un full scan (es un espanto) sino que además desactiva todo índice que exista sobre ese campo.

Más allá de eso, usar "%%" simplemente es como si no existiese esa condición, porque le estás diciendo "devolveme todo, haya lo que haya".
¿Para qué lo pondrías entonces?

En tu consulta tenemos:
Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     Player LIKE '%%'
  5.     AND Name LIKE '%test%'
  6.     AND LastName LIKE '%%'
  7.     AND Email LIKE '%%'
  8.     AND Password LIKE '%%'
  9.     AND Phone LIKE '%%'
  10.     AND Zip LIKE '%%'
  11.     AND STATUS = 'D
Si eliminamos lo superfluo, quedaría:

Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     AND Name LIKE '%test%'
  5.     AND STATUS = 'D'
¿Por qué te edvuelve entonces cantidades distintas?
Bueno, voy a hacer una suposición, en base a mi experiencia en diferentes DBMS: El "%%" implica que debe haber ALGO en ese campo, aunque eso sea un espacio nulo o vacío, pero no debe ser NULL, ya que NULL no suele ser un dato, sino un estado.
Es probable que la consulta correcta fuese:

Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     Player IS NOT NULL
  5.     AND Name LIKE '%test%'
  6.     AND LastName IS NOT NULL
  7.     AND Email IS NOT NULL
  8.     AND Password IS NOT NULL
  9.     AND Phone IS NOT NULL
  10.     AND Zip IS NOT NULL
  11.     AND STATUS = 'D

Prueba y me dices.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/11/2013, 11:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Algo pasa con los WHERE cuando llevan LIKE '%%' ?

Excelente observación.
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 07/11/2013, 12:37
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Algo pasa con los WHERE cuando llevan LIKE '%%' ?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En primer lugar, usar un comodin de ambosl lados es una muy mala idea. Eso le indica al DBMS que busque lo que comience con cualquier cosa y lo que termine con cualquiier cosa, y eso es algo que sólo se puede resolver leyendo toda la tabla.
Este tipo de condiciones se debe evitar porque no sólo genra un full scan (es un espanto) sino que además desactiva todo índice que exista sobre ese campo.

Más allá de eso, usar "%%" simplemente es como si no existiese esa condición, porque le estás diciendo "devolveme todo, haya lo que haya".
¿Para qué lo pondrías entonces?

En tu consulta tenemos:
Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     Player LIKE '%%'
  5.     AND Name LIKE '%test%'
  6.     AND LastName LIKE '%%'
  7.     AND Email LIKE '%%'
  8.     AND Password LIKE '%%'
  9.     AND Phone LIKE '%%'
  10.     AND Zip LIKE '%%'
  11.     AND STATUS = 'D
Si eliminamos lo superfluo, quedaría:

Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     AND Name LIKE '%test%'
  5.     AND STATUS = 'D'
¿Por qué te edvuelve entonces cantidades distintas?
Bueno, voy a hacer una suposición, en base a mi experiencia en diferentes DBMS: El "%%" implica que debe haber ALGO en ese campo, aunque eso sea un espacio nulo o vacío, pero no debe ser NULL, ya que NULL no suele ser un dato, sino un estado.
Es probable que la consulta correcta fuese:

Código SQL:
Ver original
  1. SELECT IdPlayer, Player, Name, LastName, Email, Password, IdBook
  2. FROM PLAYER
  3. WHERE
  4.     Player IS NOT NULL
  5.     AND Name LIKE '%test%'
  6.     AND LastName IS NOT NULL
  7.     AND Email IS NOT NULL
  8.     AND Password IS NOT NULL
  9.     AND Phone IS NOT NULL
  10.     AND Zip IS NOT NULL
  11.     AND STATUS = 'D

Prueba y me dices.
Una explicacion excelente gnzsoloyo, agrego una observacion sobre el uso del like.

Hay que tener en cuenta el uso que se le da al operador ya que al aplicarlo sobre un campo especifico omite el indice asociado a esa columna. Asi que, a tener cuidado jeje.

Saludos

damimg

Etiquetas: select
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 07:57.