es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo construir una tabla de decisiones con lógica “NOT IN (a,b,c)”?

Supongamos que hay una regla comercial utilizada para derivar un valor y debido a cómo los usuarios comerciales necesitan actualizar esto, la lógica debe mantenerse en una tabla y no en una función.

Ejemplo de función actual

 CUANDO inputA EN (1,2,3)   Y inputB NO EN (55,66)   ENTONCES OUTPUT = 'HQ'
 CUANDO inputA EN (3,6)     Y inputB     EN (27,44) ENTONCES OUTPUT = 'Northern'
 CUANDO inputC EN (6,4,1)   Y inputB NO EN (55,66)   ENTONCES OUTPUT = 'Eastern'
 etc.


Puedo construir una tabla con una fila para cada combinación
por ejemplo,

| OUTPUT   | A val | B val | C val | D val | ... |
| ------   | ----- | ----- | ----- | --- | --- |
| Northern | 3     | 27    |       |     | |
| Northern | 3     | 44    |       |     | |
| Northern | 6     | 27    |       |     | |
| Northern | 6     | 44    |       |     | |

¿Cómo modelar entonces la parte "NO EN" de esto?

Seguramente hay una manera en la que no tengo que crear todas las filas de "excepción" que potencialmente necesitarían ser actualizadas basadas en datos de referencia cambiantes.
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un enfoque podría ser utilizar una bandera de bits o una máscara de bits para representar los valores excluidos. Por ejemplo, si inputB no debería ser 55 ni 66, podemos asignarles los valores binarios 1 y 2 respectivamente. Luego, podemos representar los valores excluidos como la suma de estos valores, que en este caso sería 3. Podemos almacenar este valor en la tabla y utilizar operadores bitwise para verificar si un valor está excluido o no. De esta manera, solo necesitamos actualizar los datos de referencia y no las filas de excepción.

    Por ejemplo, la tabla podría verse así:

    OUTPUT Valor A Valor B Valor C Valores excluidos
    Norte 3 27 0
    Norte 3 44 0
    Norte 6 27 0
    Norte 6 44 0
    HQ 1 3
    HQ 2 3
    Este 4 3
    Este 6 3
    Este 1 3

    Luego, podemos utilizar operadores bitwise en la consulta para verificar si un valor está excluido o no. Por ejemplo:

    SELECT OUTPUT FROM tabla WHERE 
    inputA = 1 AND (inputB & 3) != 3
    

    Esto devolvería las filas donde inputA es 1 e inputB no es 55 ni 66.

    Este enfoque requeriría un desarrollo adicional para manejar las operaciones bitwise y convertir entre valores binarios y decimales, pero podría ahorrar mucho esfuerzo de mantenimiento a largo plazo.

Comments are closed.