2010-12-02 11 views
9

Tengo una lista de nombres de lugares y me gustaría asociarlos a los registros en una base de datos SQL el problema es que las propiedades tienen números de referencia después de su nombre. p.ej. 'Ballymena P-4sdf5g' ¿Es posible su uso en y como para que coincida con los registros¿Es posible usar LIKE e IN para una sentencia WHERE?

WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%') 

Respuesta

8

Es un error común que para el constructo

b IN (x, y, z) 

que (x, y, z) representa un conjunto. No es asi.

Más bien, es simplemente azúcar sintáctica para

(b = x OR b = y OR b = z) 

SQL tiene más que una estructura de datos: la tabla. Si desea consultar valores de texto de búsqueda como un conjunto, colóquelos en una tabla. Puede JOIN su tabla de texto de búsqueda a su tabla Places usando LIKE en la condición JOIN p.

WITH Places (Name) 
    AS 
    (
     SELECT Name 
     FROM (
       VALUES ('Ballymeade Country Club'), 
        ('Ballymena Candles'), 
        ('Bangers & Mash Cafe'), 
        ('Bangebis') 
      ) AS Places (Name) 
    ), 
    SearchText (search_text) 
    AS 
    (
     SELECT search_text 
     FROM (
       VALUES ('Ballymena'), 
        ('Banger') 
      ) AS SearchText (search_text) 
    ) 
SELECT * 
    FROM Places AS P1 
     LEFT OUTER JOIN SearchText AS S1 
      ON P1.Name LIKE S1.search_text + '%'; 
12

No, pero se puede usar o en su lugar:

WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR 
     dbo.[Places].[Name] LIKE 'Banger%') 
2

así una solución simple sería el uso de expresiones regulares no está seguro de cómo se hace en SQL, pero probablemente algo similar a este

WHERE dbo.[Places].[Name] SIMILAR TO '(Banger|Ballymena)'; 

o

WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)'); 

uno de ellos debería funcionar al menos

+0

De hecho podría funcionar, pero el soporte de expresiones regulares no es estándar SQL .. –

+0

¿qué tal si? – Breezer

+0

'similar a' supuestamente se reemplaza con 'regexp_like' en el estándar. Ya veremos. – Donnie

1

que pueda usar o

WHERE 
    dbo.[Places].[Name] LIKE 'Ballymena%' 
    OR dbo.[Places].[Name] LIKE 'Banger%' 

o dividir la cadena en el espacio, si el places.name es siempre en el mismo formato.

WHERE SUBSTRING(dbo.[Places].[Name], 1, CHARINDEX(dbo.[Places].[Name], ' ')) 
    IN ('Ballymena', 'Banger') 

Esto podría disminuir el rendimiento, ya que la base de datos puede ser capaz de utilizar índices con igual (si el comodín es al final usted tiene incluso una mejor oportunidad), pero la mayoría probablemente no cuando se utiliza subcadena.

+0

Desafortunadamente, algunos nombres de lugares tienen espacios en, pero sin embargo, una buena solución +1 – Euclid

Cuestiones relacionadas