2009-01-27 19 views
8

Actualmente tengo la consulta se ejecuta en Postgres:¿Por qué mi consulta con LIKE '% _' devuelve todas las filas y no solo las que terminan en un guión bajo?

SELECT * FROM addenda.users WHERE users.username LIKE '%\_' 

Pero en lugar de devolver sólo entradas que termina en un guión, me sale todos los resultados de nuevo, independientemente de si contiene un guión o no.

Ejecutar la consulta siguiente devuelve un nombre de usuario que está a sólo un guión bajo, por lo que el escapar ya trabajo:

SELECT * FROM addenda.users WHERE users.username LIKE '\_' 

y ejecutar la consulta siguiente devuelve un nombre de usuario que termina con una letra (s) específica:

SELECT * FROM addenda.users WHERE users.username LIKE '%s' 

¿Qué estoy haciendo mal?

Respuesta

16

Está su barra invertida no conseguir a través de PostgreSQL? Si estás pasando la cuerda por otra capa que trata la barra invertida como carácter de escape (por ejemplo, una cadena de Java), entonces esa capa puede ser la eliminación de la barra invertida, y es posible que tenga que escapar de su barra invertida para esa capa.

¿Tiene alguna nombres de usuario de caracteres más simples? Si la barra invertida no estaba recibiendo a través de PostgreSQL entonces también coincidirían '_'

Usted puede ser capaz de probar el ESCAPE clause: username LIKE '%!_' ESCAPE '!'

+0

estoy de ejecutar la consulta directamente en el servidor para la barra invertida está llegando. ¡Solo traté de usar el comando ESCAPE y eso lo hizo funcionar exactamente como yo quiero! –

+1

Al insertar una cadena en una instrucción preparada, '\ _' coincide con el carácter de subrayado, pero cuando la instrucción sql tiene una cadena literal, necesita' \\ _ 'en su lugar. Supongo que es porque el primer '\' escapa del segundo '\' en el nivel de cadena literal, luego en el nivel de postgres ve '\ _' en la cadena y lo empareja con el carácter de subrayado. Se –

+0

dependen en gran medida de la configuración de 'standard_conforming_strings' si se apaga lo que necesita para duplicar el' \ 'y' e' debe poner antes de la marca de cotización. si está activado solo se necesita un '\'. – Jasen

2

Ha sido un tiempo desde que he usado postgres, pero creo que se puede haz '% [_]' para obtener lo que quieres. Eso ciertamente funciona en el servidor SQL, aunque ahora no tengo una configuración de base de datos de postgres para probarlo en

+1

No, esa extensión no estándar a SQL no está presente en postgres. – Jasen

5

"_" es el comodín de un solo carácter en la mayoría de las variantes de SQL. TIENE que escapar si quiere hacer coincidir un personaje real "_".

2

usted tiene que reemplazar la barra invertida en su consulta con un doble, así:

SELECT * FROM addenda.users WHERE users.username LIKE '%\\_'

Todavía usted puede conseguir un uso no estándar de \\ en una cadena literal advertencia, pero la consulta ser ejecutado.
Probado en Postgres 8.4.

Cuestiones relacionadas