2009-07-31 19 views
5
SELECT * 
FROM `thread` 
WHERE forumid NOT IN (1,2,3) AND IF(LEFT(title, 1) = '#', 1, 0) 
ORDER BY title ASC 

Ho questa query che selezionerà qualcosa se inizia con un #. Quello che voglio fare è se # è dato come valore cercherà numeri e caratteri speciali. O tutto ciò che non è una lettera normale.MySQL - Se inizia con un numero o un carattere speciale

Come faccio?

risposta

17

Se si desidera selezionare tutte le righe il cui "titolo" non iniziare con una lettera, utilizzare REGEXP:

SELECT * 
    FROM thread 
    WHERE forumid NOT IN (1,2,3) 
    AND title NOT REGEXP '^[[:alpha:]]' 
ORDER BY title ASC 
  • NON significa "non" (ovviamente;))
  • ^ significa "inizia con"
  • [[: alpha:]] significa "caratteri alfabetici solo"

Ulteriori informazioni su REGEXP in MySQL's manual.

+1

url di lavoro per regexp manuale è https://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp – dsomnus

1

è possibile si può provare a lanciarlo come un char:

CAST('#' AS CHAR) 

ma non so se questo funzionerà per il cancelletto (aka simbolo cancelletto :)) perché quello è il simbolo per l'avvio di commento in MySQL

+0

Im un vero principiante MySQL. Quella clausola NOT IN è alquanto cauta sulla mia testa solo per metterla in un contesto. Puoi spiegare un po 'di più per favore :) –

+0

basta sostituire 'AND IF (LEFT (title, 1) =' # ', 1, 0)' con 'AND IF (LEFT (title, 1) = CAST (' # 'AS CHAR), 1, 0) ', ma come ho detto, non so se funzionerà con octothorpes – Jason

+0

Non funziona. Non restituisce nulla. –

1
SELECT t.* 
    FROM `thread` t 
    WHERE t.forumid NOT IN (1,2,3) 
    AND INSTR(t.title, '#') = 0 
ORDER BY t.title 

Utilizzare il INSTR per ottenere la posizione di una stringa data - se si vuole quando una stringa inizia, verificare la presenza di 0 (possibilmente 1 - la documentazione non indica se è basata zero o uno) .

Problemi correlati