2012-11-03 6 views
30

Cosa succede quando si esegue una query SQL in cui la clausola IN è vuota?Elenco dei parametri della clausola IN vuota in MySQL

Ad esempio:

SELECT user WHERE id IN(); 

Sarà MySQL gestire questo come previsto (cioè, sempre false), e se non, come in grado di gestire la mia domanda questo caso quando si costruisce la clausola IN dinamicamente?

+9

Perché non provarlo? –

+0

Il valore della colonna id non è chiaramente in un set vuoto, poiché nulla è in un set vuoto. Inoltre, risulta che la sintassi è errata. http://sqlfiddle.com/#!2/a2581/2412 –

+9

Non mi preoccuperei di chiedere questo su SO, ma è stato conveniente trovarlo già qui. –

risposta

10

l'approssimazione più vicina della vostra query con sintassi valida è:

SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE); 

che incondizionatamente restituire un set di risultati vuoto. La sottoquery nella parentesi restituisce sempre un set vuoto e, come accennato in precedenza, non è possibile trovare alcun valore in un set vuoto, poiché un set vuoto non contiene valori.

+3

Un'altra sottoquery che restituisce un insieme vuoto è '(seleziona superiore 0 0)', che ha il vantaggio di non richiedere un nome di tabella. – benrwb

+4

Questo non aiuta molto nel caso in cui si generi dinamicamente una lista 'IN' letterale. Non sta cercando un modo per produrre una vacua clausola 'IN', vuole sapere come affrontarla quando accade accidentalmente perché ha dato una serie vuota di valori. – Barmar

+0

o semplicemente 'SELEZIONA utente DA tbl1 DOVE id IN (FALSE)' –

32

Se si dispone di un'applicazione in cui sto creando l'elenco IN in modo dinamico e potrebbe finire vuoto, ciò che a volte faccio è inizializzare l'elenco con un valore impossibile e aggiungere a quello. Per esempio. se si tratta di un elenco di nomi utente, inizierò con una stringa vuota, poiché non è un possibile nome utente. Se si tratta di un ID autoincremento, userò -1 perché i valori effettivi sono sempre positivi.

Se ciò non è possibile perché non ci sono valori impossibili, è necessario utilizzare un condizionale per decidere se includere l'espressione AND column IN ($values) nella clausola WHERE.

0

Si può solo impostare la condizione in questo modo:

$condition = 'FALSE' // Could feasibly want TRUE under different circumstances 
if($values){ 
    $condition = *dynamically_generate_IN_condition_from_values* 
} 

$sql = 'SELECT * FROM `user` WHERE '.$condition; 
7

Questo mi dà 0 risultati così:

SELECT id FROM User 
WHERE id IN (NULL); 

provato su MySQL 5.6

+2

Questo può essere problematico perché 'id IN (NULL)' restituisce 'NULL' e non' FALSE'. Questo è principalmente un problema per 'NOT IN':' SELECT id FROM User WHERE id NOT IN (NULL); 'restituirà anche 0 risultati. – MicahStetson

0

utilizzare un'istruzione sempre false

Prima di creare l'SQL, verificare la dimensione dell'array. Se la dimensione è 0, generare l'istruzione dove come 1 = 2, come in:

SELECT * FROM USERS WHERE name in() 

diventa

SELECT * FROM USERS WHERE 1 = 2 

Per "non" a un array vuoto, generare un sempre vero economico come in:

SELECT * FROM USERS WHERE name not in() 

diventa

SELECT * FROM USERS WHERE 1 = 1 

Questo dovrebbe funzionare per le query più complesse come:

SELECT * FROM USERS WHERE (name in() OR name = 'Alice') 

diventa

SELECT * FROM USERS WHERE (1 = 2 OR name = 'Alice') 
0

Se si utilizza AUTO_INCREMENT per id (1,2,3, ..) e se array è vuoto, è possibile aggiungere un elemento [0].Quindi sarà

if (empty($arr)) { 
    $arr[] = 0; 
} 

SELECT user WHERE id IN (0); 

E non ci sarà nessun errore di analisi mysql.