2010-06-17 11 views
5

que tienen esta condición SQL que se supone que debe recuperar todas las filas que satisfacen la condición de expresión regular dada:MySQL REGEXP: entradas coincidentes en blanco

country REGEXP ('^(USA|Italy|France)$') 

Sin embargo, tengo que añadir un patrón para recuperar todos los valores de campo en blanco. Actualmente estoy usando esta condición

country REGEXP ('^(USA|Italy|France)$') OR country = "" 

¿Cómo se puede lograr el mismo efecto sin tener que incluir la cláusula O?

Gracias, Erwin

Respuesta

2

usted podría intentar:

country REGEXP ('^(USA|Italy|France|)$') 

que acaba de agregar otra | después France, que debe básicamente sería decirle que también coincide con ^$ que es el mismo que country = ''.

Actualización: ya que este método no funciona, yo recomendaría utiliza esta expresión regular:

country REGEXP ('^(USA|Italy|France)$|^$') 

Tenga en cuenta que no se puede utilizar la expresión regular: ^(USA|Italy|France|.{0})$ porque se quejan de que hay una subexpresión vacía Aunque ^(USA|Italy|France)$|^.{0}$ funcionaría.

Éstos son algunos ejemplos del valor de retorno de esta expresión regular:

select '' regexp '^(USA|Italy|France)$|^$' 
> 1 
select 'abc' regexp '^(USA|Italy|France)$|^$' 
> 0 
select 'France' regexp '^(USA|Italy|France)$|^$' 
> 1 
select ' ' regexp '^(USA|Italy|France)$|^$' 
> 0 

Como se puede ver, devuelve exactamente lo que quiere.

Si desea tratar los valores en blanco los mismos (por ejemplo, 0 espacios y 5 plazas de tanto contar como blanco), se debe utilizar la expresión regular:

country REGEXP ('^(USA|Italy|France|\s*)$') 

Esto hará que la última fila en el ejemplo anterior para comportan de manera diferente, es decir:

select ' ' regexp '^(USA|Italy|France|\s*)$' 
> 1 
+0

Usted Sabes, podrías haber usado '^ $' en lugar de '^. {0} $' en el lado derecho del '' – gnarf

+0

@gnarf: woops, estaba tratando de evitar el uso de miradas Pasé por alto estas simples soluciones que brindó. Gracias, actualicé la respuesta. – Senseful

5

Esto debería funcionar:

country REGEXP ('^(USA|Italy|France|)$') 

Sin embargo a partir de un perfo punto de vista rmance, es posible que desee utilizar la sintaxis en

country IN ('USA','Italy','France', '') 

La tarde debe ser más rápido que REGEXP puede ser bastante lento.

+0

Ya he intentado agregar el extra |, pero me dio este error: "Obtuve el error 'expresión (sub) vacía' de regexp" – Erwin

+0

Cuando traté de cambiar la expresión a "país REGEXP ('^ (EE.UU. | Italia | Francia | [\ s] *) $ ') ", funcionó. ¿Algún problema con este enfoque? @Ben btw Necesito usar REGEXP para esto, porque hay momentos en los que necesito usar un patrón en lugar del nombre real del país. – Erwin

+2

@Erwin: el único problema con '\ s *' es que coincidirá con entradas 'en blanco' como 3 espacios. Si no tiene entradas como esta en su base de datos, entonces debería estar bien. – Senseful

5

No hay ninguna razón por la que no puede utilizar el (partido final de la cadena) $ para llenar en su tema "sub-expresión vacía" ...

Se ve un poco extraño, pero en realidad country REGEXP ('^(USA|Italy|France|$)$') trabajará

+0

+1: Esta es una buena solución. – Senseful

Cuestiones relacionadas