2011-09-06 13 views
47

Non riesco a capire cosa faccia il carattere di sottolineatura in un'istruzione SQLite like. Il carattere jolly, %, è probabilmente lo stesso della maggior parte degli altri database SQL.SQLite come% e _

Quindi, cosa fa il maledetto personaggio _?

risposta

58

Il trattino di sottolineatura è lo stesso della maggior parte degli altri database SQL e corrisponde a qualsiasi carattere singolo (ad esempio, è lo stesso di . in un'espressione regolare). Da fine manual:

Un trattino di sottolineatura ("_") nel modello LIKE corrisponde a qualsiasi singolo carattere nella stringa.

Ad esempio:

-- 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 

E proprio per assicurarsi che i risultati hanno senso: SQLite utilizza zero and one for booleans.

+1

Grazie, mu. [caratteri extra] – Francisc

+0

Nota: 'seleziona 'pancake' come 'pan__kes'' funziona. –

76

E 'SQL standard che in LIKE espressioni:

  • % corrisponde a qualsiasi sequenza di caratteri, tra cui uno vuoto. È equivalente a .* in un'espressione regolare.
  • _ corrisponde a un singolo carattere. È equivalente a . in un'espressione regolare.
  • È possibile scegliere un personaggio per sfuggire %, _ e si se stesso con:

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

    Questo corrisponderà a×b×××c\d%_ o a×bc\d%_ ma non abc\d%_a×b×××cd%_.

Additionnally con SQLite si ha la parola chiave GLOB che si comporta esattamente nello stesso modo, solo che diventa %* e _ diventa ?.

+0

Grazie, Benoit. Ho scelto l'altra risposta a giudicare solo dal tempo. – Francisc

+0

Questo mi ha salvato la vita. Stavo cercando come sfuggire a '%' nelle query SQLite. Ma dovevo dare '\\' per farlo funzionare, non solo '\' (stavo lavorando su Javscript + WebSQL). La query qui sotto ha funzionato per me. SELEZIONA * DA offerte WHERE titolo LIKE '% 50 \\ %%' ESCAPE '\\' (questo restituirà tutte le offerte con titolo pari al 50%) – hashcoder

+0

@Francisc, penso che all'inizio eri giusto scegliere la risposta in base a il tempo, ma questa risposta è più chiara della risposta attualmente accettata. Sarebbe un servizio ai futuri utenti per rendere questa la risposta accettata. – Suragch

0

Per la registrazione, utilizzo nell'ambiente XCode/Objective-C, '\' non funziona. Utilizzare qualsiasi altra cosa invece ...

C-style sfugge utilizzando il carattere backslash non sono supportate perché non sono SQL standard (https://www.sqlite.org/lang_expr.html)

6

Addendum al @ risposta di Benoit:

Il ESCAPE si applica alla più recente espressione LIKE, non a tutte le espressioni LIKE. Per sfuggire a tutti è necessario utilizzare ESCAPE più volte, ad esempio di seguito.

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

Questo predicato corrisponde valori di foo che contengono bar%, o baz più qualsiasi carattere.