Domanda

c'è una domanda galleggiava. E 'ambientato in termini di SQL di base, ma la sua natura è pura matematica (quindi forse dovrei visitare http://mathoverflow.com troppo).

Ho una tabella in qualche base di dati teorici con 6 campi, tutti sono i numeri. Inoltre abbiamo condizioni di base, come Campo_1> Field_5, Field_4 = 3, ecc, 7 condizioni totale. Ho bisogno di scrivere una selezione, che soddisfa almeno 4 di loro.

Scrittura looooooooooooooooooooooooooong selezionare con molte condizioni logici come (cond_1 E cond_2 E cond_3 e cond_4) OR (...) non è un modo, perché 4 combinazione da 7 elementi è uguale a 140 , e non si vuole scrivere così tante condizioni.

Quindi, come faccio a scrivere un selezionare nella sua forma semplificata?

È stato utile?

Soluzione

Un modo per farlo è quello di contare 1 per ogni condizione che le soddisfa riga e di confrontare la somma al valore nominale:

SELECT * 
FROM yourtable
WHERE (
          (CASE WHEN condition1 THEN 1 ELSE 0 END) +
          (CASE WHEN condition2 THEN 1 ELSE 0 END) +
          ...
          (CASE WHEN condition7 THEN 1 ELSE 0 END)
      ) >= 4

Si noti che questo richiederà la valutazione di tutte le condizioni per ogni riga in modo da non ottenere un effetto di corto circuito, ma è semplice e forse ha buone prestazioni abbastanza per voi.

Se si utilizza MySQL è possibile scrivere questo in un modo molto più semplice, perché un risultato booleano è equivalente a 0 o 1 in modo non è necessario leggere le normative CASE:

WHERE (condition1) + (condition2) + ... + (condition7) >= 4

Altri suggerimenti

Si potrebbe semplicemente aggiungere la somma delle vere condizioni di insieme, a la

CASE 
WHEN Field1 > Field5 THEN
    1
ELSE
    0
END
+
CASE
WHEN Field4 = 3 THEN
    1
ELSE
    0
END
+
etc
AS condition_sum

e filtro sul condition_sum> soglia. Si potrebbe anche mettere la cattiveria di tale espressione della somma dei casi in una funzione per il codice un po 'più leggibile.

suggerirei semplicemente contando fino come sono soddisfatti molte condizioni. La sintassi particolare dipenderà da quale motore di gestione di database che si sta utilizzando, ma in MySQL sarebbe simile a questa:

SELECT things
FROM places
WHERE IF(cond_1, 1, 0) + IF(cond_2, 1, 0) + IF(cond_3, 1, 0) + IF(cond_4, 1, 0) + IF(cond_5, 1, 0) >= 4;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top