Domanda

SELECT * FROM table WHERE col LIKE '%'

restituirà tutto. Esiste un carattere jolly per la query

SELECT * FROM table WHERE col = '*'

Chiaramente * non funziona, l'ho messo lì per indicare dove vorrei un jolly. La colonna da cui sto selezionando contiene un numero intero compreso tra 1 e 12 e desidero poter selezionare tutti i record con un determinato numero o tutti i record con un carattere jolly.

Grazie,

È stato utile?

Soluzione

LIKE è sostanzialmente lo stesso di =, tranne LIKE che ti consente di usare i caratteri jolly.

Queste due query restituiranno gli stessi risultati:

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

Senza un '%' nella query LIKE, è effettivamente lo stesso di '='.

Se stai facendo una selezione su una colonna intera, dovresti considerare di usare gli operatori IN () o TRA. Sembra che tu abbia due condizioni separate che dovrebbero essere gestite nel tuo codice, piuttosto che nella query, poiché le tue condizioni indicano che hai bisogno di almeno due diversi tipi di query.

Modifica: dovrei chiarire che LIKE e = sono simili solo nell'uso normale di confronto delle stringhe humdrum. Dovresti controllare il Manuale MySQL per dettagli su come funziona, in quanto vi sono situazioni in cui non è la stessa (come i set di lingue).

Altri suggerimenti

Se si desidera selezionare tutto, perché si allega affatto la clausola WHERE? Basta lasciarlo condizionatamente invece di inserire un jolly.

Il motivo dell'utilizzo di LIKE è perché = non offre il supporto jolly. Altrimenti non ci sarebbe motivo per LIKE

SELECT * FROM table WHERE col RLIKE '.*'

vale a dire. espressione regolare COME.

La risposta di zombat è ottima, ma nella sua risposta ho notato solo che stai selezionando numeri interi. Ha citato IN () e BETWEEN (). Ecco alcuni esempi che utilizzano tali sintassi, nonché 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);

Supponendo che la tua query sia basata sui parametri, un'istruzione case è probabilmente appropriata

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

Dove @myvariable è nullo se non si desidera un valore, altrimenti userebbe il valore intero che si passa.

Ho riscontrato un caso del genere durante la creazione di una stored procedure per un report Di seguito è la mia soluzione, spero che questo sia ciò che avevi in ??mente :)

set @p = "ALL";

Domanda:

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

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

seleziona * dalla tabella dove col > = 5 e col < = 5; // questo è uguale a col = 5

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top