2011-09-06 12 views
47

No puedo entender lo que hace el carácter de guión bajo en una instrucción SQLite like. El carácter comodín, %, es probablemente el mismo que en la mayoría de las otras bases de datos SQL.SQLite como% y _

Entonces, ¿qué hace el maldito personaje _?

Respuesta

58

El guión bajo también es el mismo que en la mayoría de las otras bases de datos SQL y coincide con cualquier carácter individual (es decir, es el mismo que . en una expresión regular). De fine manual:

Un guión bajo ("_") en el patrón LIKE coincide con cualquier carácter de la cadena.

Por ejemplo:

-- The '_' matches the single 'c' 
sqlite> select 'pancakes' like 'pan_akes'; 
1 
-- This would need '__' to match the 'ca', only one '_' fails. 
sqlite> select 'pancakes' like 'pan_kes'; 
0 
-- '___' also fails, one too many '_'. 
sqlite> select 'pancakes' like 'pan___kes'; 
0 

Y sólo para asegurarse de que los resultados tienen sentido: SQLite utiliza zero and one for booleans.

+1

Gracias, mu. [caracteres extra] – Francisc

+0

Nota: 'seleccionar 'panqueques' como 'pan__kes'' funciona. –

76

Es SQL estándar que en LIKE expresiones:

  • % coincide con cualquier secuencia de caracteres, incluyendo una vacía. Es equivalente a .* en una expresión regular.
  • _ coincide con un solo carácter. Es equivalente a . en una expresión regular.
  • Usted puede elegir un personaje para escapar %, _ y en sí misma con:

    ... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\' 
    

    Esto corresponderá con a×b×××c\d%_ o a×bc\d%_ pero no abc\d%_ ni a×b×××cd%_.

Additionnally con SQLite tiene la palabra clave GLOB que se comporta exactamente de la misma manera, excepto que se convierte en %* y _ convierte ?.

+0

Gracias, Benoit. Elegí la otra respuesta a juzgar solo por el tiempo. – Francisc

+0

Esto me salvó la vida. Estaba buscando cómo escapar '%' en las consultas de SQLite. Pero tuve que dar '\\' para que funcionara, no solo '\' (estaba trabajando en Javscript + WebSQL). Debajo de la consulta funcionó para mí. SELECCIONAR * FROM ofertas DONDE el título LIKE '% 50 \\ %%' ESCAPE '\\' (esto devolverá todas las ofertas con título que tenga el 50%) – hashcoder

+0

@Francisc, creo que al principio fue justo elegir la respuesta según el tiempo, pero esta respuesta es más clara que la respuesta actualmente aceptada. Sería un servicio para los futuros usuarios hacer de esto la respuesta aceptada. – Suragch

0

Para el registro, que uso en el entorno XCode/Objective-C, '\' no funciona. Utilizar cualquier otra cosa en su lugar ...

C-estilo escapa usando la barra invertida no son compatibles porque no son estándar SQL (https://www.sqlite.org/lang_expr.html)

6

Adición al @ respuesta de Benoit:

El ESCAPE se aplica a la expresión LIKE más reciente, no a todas las expresiones LIKE. Para escapar de todo, debe usar ESCAPE varias veces, como a continuación.

WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^' 

Este predicado coincide con los valores de foo que contienen barra%, o Baz y cualquier otro carácter.

Cuestiones relacionadas