Pregunta

hay una pregunta flotaba. Se fija en términos de SQL básicas, pero su naturaleza es pura matemática (por lo que tal vez debería visitar http://mathoverflow.com también).

Tengo una tabla en alguna base de datos teórica con 6 campos, todos son números. También tenemos condiciones básicas, tales como Campo_1> Field_5, Field_4 = 3 etc., 7 condiciones de completa. Tengo que escribir un selecto, que satisface al menos 4 de ellos.

Escritura looooooooooooooooooooooooooong seleccionar con muchas condiciones lógicas tales como (cond_1 Y cond_2 Y cond_3 y cond_4) OR (...) no es una manera, porque 4-combinación a partir de 7 elementos es igual a 140 y uno no quiere escribir tantas condiciones.

Entonces, ¿cómo puedo escribir una selecta en su forma simplificada?

¿Fue útil?

Solución

Una forma de hacerlo es contar 1 para cada condición de que los satisface fila y comparar la suma de su valor objetivo:

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

Tenga en cuenta que para ello será necesario evaluar todas las condiciones de cada fila para que no conseguirá un efecto de cortocircuito, pero es simple y tal vez tiene un buen rendimiento suficiente para ti.

Si estás usando MySQL se puede escribir esto de una manera mucho más simple porque un resultado booleano es equivalente a 0 o 1, de modo que no es necesario las instrucciones CASE:

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

Otros consejos

Simplemente podría añadir la suma de las condiciones verdaderas a la vez, a la

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

y filtro en condition_sum> umbral. Incluso se puede poner la maldad de esa expresión de suma de los casos en una función de código ligeramente más legible.

Me gustaría sugerir simplemente contando cómo se satisfacen muchas condiciones. La sintaxis particular dependerá de qué motor de base de datos de gestión que está utilizando, pero en MySQL se vería algo como esto:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top