2013-12-13 6 views
5

Diciamo che ho una tabella:SQL: Perché LIKE non funziona se viene utilizzata la classe di carattere [0-9]?

tabella corrente:

title_id  title_name    title_qty 
    1  A.I. Artificial Intelligence  2 
    2  Batman Begins     40 
    3  2012        7 
    4  101 Dalmatians     23 
    5  Act of Valor      1 
    6  Batman       50 
    7  20 Million Miles to Earth  340 

Mi piacerebbe avere una potenza di:

output desiderato:

title_id  title_name    title_qty title_char 
     4   101 Dalmatians    23   # 
     7   20 Million Miles to Earth  340   # 
     3    2012     7   # 
     1   A.I. Artificial Intelligence 2   A 
     5   Act of Valor     1   A 
     6   Batman      50   B 
     2   Batman Begins     40   B 

Basato su ciò che ho letto qui in Stack Overflow, il modo più veloce per fare chec K Se un personaggio è un numero è quello di utilizzare LIKE '[0-9]%' così mi si avvicinò con

Query:

SELECT *, CASO QUANDO SINISTRA (TITLE_NAME, 1) COME '[0-9]%' poi "#" ELSE SINISTRA (TITLE_NAME, 1) END come title_char dal titolo ORDER BY TITLE_NAME

uscita:

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   1 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

Come mostrato sopra, non funziona affatto. Ma se cambio il LIKE per abbinare una sola cifra, funziona:

SELECT *, CASO QUANDO SINISTRA (TITLE_NAME, 1) LIKE '1%' poi "#" ELSE SINISTRA (TITLE_NAME, 1) END come title_char dal titolo ORDER BY TITLE_NAME

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   # 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

inizialmente ho pensato che non funziona perché la mia domanda è un po 'complicato così ho fatto un semplice scegliere dove. Il LIKE viene aggiunto dopo il WHERE.

Nessuna uscita (quando non ci dovrebbero essere tre):

SELECT * FROM title WHERE title_name LIKE '[0-9]%' ORDER BY title_name 

funziona come previsto:

SELECT * FROM title WHERE title_name LIKE '1%' ORDER BY title_name 

SELECT * FROM title WHERE title_name LIKE '2%' ORDER BY title_name 

Secondo la documentazione di SQL,

Un personaggio la classe "[...]" corrisponde a qualsiasi personaggio all'interno delle parentesi. Ad esempio, "[abc]" corrisponde a "a", "b" o "c". Per nominare un intervallo di caratteri , utilizzare un trattino. "[A-z]" corrisponde a qualsiasi lettera, mentre "[0-9]" corrisponde a qualsiasi cifra.

Qualcuno sa perché non funziona se si è utilizzata la classe di carattere [0-9]? Come principiante, per favore correggimi se sbaglio. Ma sono curioso del perché funzioni se uso LIKE '1%' o qualsiasi cifra mentre LIKE '[0-9]%' non darà alcun risultato? La documentazione dice che dovrebbe corrispondere a qualsiasi cifra, giusto? Se lanciarlo come numero intero è un requisito, non dovrebbe funzionare su tutti i miei test, giusto?Perché non l'ho lanciato prima di fare il confronto LIKE.

SQL violino:http://sqlfiddle.com/#!2/492906/7

+1

Ho modificato la domanda ... Solo per aggiungere questa è la query che può produrre l'output corretto, ho usato RLIKE: SELECT *, CASE WHEN LEFT (title_name, 1) RLIKE '[0-9]' THEN "# "ELSE LEFT (title_name, 1) END come title_char FROM title ORDER BY title_name – bimspramirez

+0

[La documentazione che citi] (http://dev.mysql.com/doc/refman/5.5/en/pattern-matching.html) riguarda 'RLIKE', non' LIKE', quindi mi sembra corretto. In altri dialetti SQL, '[...]' è accettato da 'LIKE', ma (apparentemente) non in MySQL. – hvd

+0

Ciao hvd, grazie! – bimspramirez

risposta

5

The documentation è un po 'di confusione. Spero attento Snipping può renderlo più chiaro:

MySQL fornisce modello standard SQL corrispondenza così come una forma di pattern matching

[...]

SQL pattern matching consente di utilizzare “ _ "per abbinare qualsiasi carattere singolo e" % "per far corrispondere un numero arbitrario di caratteri (compresi i caratteri zero). In MySQL, i pattern SQL sono case-insensitive per impostazione predefinita. Alcuni esempi sono mostrati qui. Non si utilizza = o <> quando si utilizzano i modelli SQL; utilizzare invece gli operatori di confronto LIKE o NOT LIKE.

[...]

L'altro tipo di pattern matching forniti da MySQL utilizza espressioni regolari estese. Quando si verifica una corrispondenza per questo tipo di modello, utilizzare gli operatori REGEXP e NOT REGEXP (o RLIKE e NOT RLIKE, che sono sinonimi).

[...]

Una classe di caratteri “[...]” corrisponde a qualsiasi carattere all'interno delle parentesi quadre. Ad esempio, "[abc]" corrisponde a "a", "b" o "c". Per nominare un intervallo di caratteri, utilizzare un trattino. "[a-z]" corrisponde a qualsiasi lettera, mentre "[0-9]" corrisponde a qualsiasi cifra.

Dal momento che l'ultima frase è sotto "l'altro tipo di pattern matching", essa si applica solo al RLIKE che hai già trovato, per non LIKE.

+1

Ciao grazie hvd! Mi sono confuso. Probabilmente perché ho trovato un post qui in Stack Overflow che consiglia LIKE [0-9] per verificare se un personaggio è una cifra, quindi ho pensato che funzionasse. Grazie, ora è tutto chiaro! Scusa se la mia domanda è così semplice e sciocca, fammi sapere se dovrebbe essere cancellata. Comunque, grazie ancora sto imparando molto da qui! – bimspramirez

+1

Tutto è semplice e sciocco una volta capito il perché. :) Non ti preoccupare, è una domanda perfettamente buona. – hvd

Problemi correlati