2009-04-29 7 views
14

Quindi,MySQL jolly per "=" - c'è un

SELECT * FROM table WHERE col LIKE '%' 

tornerà tutto. Esiste un jolly per la query

SELECT * FROM table WHERE col = '*' 

Chiaramente * non funziona, ho appena messo lì per indicare dove mi piacerebbe un jolly. La colonna da cui sto selezionando contiene un numero intero compreso tra 1 e 12 e desidero essere in grado di selezionare tutti i record con un numero particolare o tutti i record con un carattere jolly.

Grazie,

risposta

11

COME è fondamentalmente uguale a =, tranne LIKE ti permette di usare caratteri jolly.

Queste due query si restituiscono gli stessi risultati:

SELECT * FROM table WHERE col LIKE 'xyz'; 
SELECT * FROM table WHERE col='xyz'; 

Senza un '%' nella query simili, è effettivamente la stessa '='.

Se si sta eseguendo una selezione su una colonna intera, è necessario considerare l'utilizzo degli operatori IN() o BETWEEN. Sembra che tu abbia due condizioni separate che dovrebbero essere gestite nel tuo codice, invece che nella query, in quanto le tue condizioni impongono che hai bisogno di almeno due diversi tipi di query.

Modifica: Devo chiarire che LIKE e = sono simili solo nel normale, uso di confronto stringa corde. Dovresti controllare lo MySQL Manual per le specifiche su come funziona, poiché ci sono situazioni in cui non è lo stesso (come i set di lingue).

+0

Grazie, proprio quello che stavo cercando. Lo gestirà nel codice e cambierà la query per includere quella particolare clausola WHERE se e quando è necessaria. – Dan

+0

MySQL supporta BETWEEN? Ho pensato che fosse solo TSQL –

+0

@Joe: BETWEEN è SQL standard. Non ho mai incontrato alcun sistema che supporti SQL che non supporti BETWEEN. –

7

La ragione per usare COME è perché i = non offre supporto dei caratteri jolly. Altrimenti non ci sarebbe ragione per LIKE

0
SELECT * FROM table WHERE col RLIKE '.*' 

, ad esempio espressione regolare LIKE.

+0

Grazie per avermi ricordato di quel simpatico operatore MySQL. RLIKE alias REGEXP vale la pena conoscere: http://dev.mysql.com/doc/refman/5.1/en/regexp.html – artlung

8

Se si desidera selezionare tutto, perché si sta allegando la clausola WHERE? Basta lasciarlo fuori condizionalmente invece di mettere un jolly in esso.

+1

Stavo pensando questo, poi ho pensato, no, è assurdo, deve solo usare il carattere jolly come esempio e in realtà avrebbe ancorato il testo su uno o entrambi i lati di esso. Poi ho riletto la domanda in dettaglio e no, hai ragione, ha solo bisogno di lasciare il WHERE per la sua applicazione. – chaos

+1

Dan, sai che la parte WHERE è opzionale, giusto? Se la lasci spenta, dovrai selezionare ogni riga. – allyourcode

0

Supponendo che la vostra richiesta è il parametro guidato una dichiarazione caso è probabilmente appropriata

select * from mytable 
where col like case when @myvariable is null then % else myvariable end 

Dove @myvariable è o nulla se non volete un valore altrimenti avrebbe usato il valore intero si passa.

0

La risposta di zombat è ottima, ma nella sua risposta ho notato solo che si stanno selezionando gli interi. Ha menzionato IN() e TRA(). Ecco alcuni esempi che utilizzano queste sintassi, oltre ad alcune altre opzioni disponibili per un campo intero.

SELECT * FROM table WHERE col = 1; 
SELECT * FROM table WHERE col BETWEEN 1 AND 12; 
SELECT * FROM table WHERE col BETWEEN 6 AND 12; 
SELECT * FROM table WHERE col <= 6; 
SELECT * FROM table WHERE col < 6; 
SELECT * FROM table WHERE col >= 6; 
SELECT * FROM table WHERE col > 6; 
SELECT * FROM table WHERE col <> 6; 
SELECT * FROM table WHERE col IN (1,2,5,6,10); 
SELECT * FROM table WHERE col NOT IN (1,2,5,6,10); 
0

ho incontrato un caso del genere, mentre la costruzione di una stored procedure per un report seguito è la mia soluzione, spero che questo è ciò che si aveva in mente :)

set @p = "ALL"; 

Query:

select * from fact_orders 
where 
dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p) 
limit 10 
; 
0

Se i valori sono compresi nell'intervallo (1,12):

selezionare * per tabella m dove col> = 5 e col < = 5; // questo è uguale a col = 5

selezionare * dalla tabella dove col> = 0 e col < = 12; // questo è uguale a col = qualsiasi valore

La stessa riga può produrre entrambi gli effetti scegliendo i 2 parametri in modo appropriato. Ho affrontato un problema simile quando avevo bisogno di una singola istruzione preparata che dovrebbe funzionare in 2 modi diversi, controllando un particolare valore in una colonna o ignorando completamente quella colonna.