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.

Oracle SQL Cómo ejecutar la segunda condición únicamente si la primera no ha sido aceptada?

Espero que alguien pueda ayudarme. El caso es el siguiente:

Tengo una tabla COMPANY_ACCESS con estas columnas:

ID NUMBER,
COMPANY_ID NUMBER,
AREA_ID NUMBER,
TEAM_ID NUMBER,
CAN_ACCESS BOOLEAN

Y tengo mi consulta (no funciona):

SELECT *
FROM COMPANY_ACCESS ca
WHERE
ca.CAN_ACCESS = true
AND ((ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID = ?3)
OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID IS NULL)
OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL))

¿Cuál es mi intención aquí? Buscar desde el acceso más específico (con todos los parámetros) hasta el menos específico. Si tengo un registro en la primera condición:

(COMPANY_ID = ?1 AND AREA_ID = ?2 AND TEAM_ID = ?3)

No necesito verificar los otros y solo devolver este registro. Si no lo tengo, verificaré sin el TEAM_ID (un acceso sin el TEAM_ID es válido para todos los equipos dentro del AREA_ID). Pero si ejecuto esta consulta, recibo registros en la primera condición y en la segunda condición y en la tercera condición. Y esa no es mi intención. Si encuentro uno en la primera condición (más específica), no necesito los otros y solo devuelvo este registro. Solo verificaré la segunda y la tercera condición si no encuentro nada en la condición anterior.

¿Por favor, alguien puede ayudarme?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándonos en la información proporcionada, parece que la intención de la consulta es recuperar registros de la tabla COMPANY_ACCESS que coincidan con los parámetros de acceso especificados. La búsqueda se realiza de manera jerárquica, comenzando desde el acceso más específico (con todos los parámetros) y luego procediendo a un acceso menos específico.

    Sin embargo, la consulta actual no está produciendo los resultados deseados, ya que devuelve registros de las tres condiciones, en lugar de solo coincidir con el acceso más específico. Para lograr el resultado deseado, es necesario modificar la consulta para que deje de ejecutarse una vez que se encuentre una coincidencia. Una forma de hacer esto es utilizando la palabra clave LIMIT en la consulta:

    SELECT * 
    FROM COMPANY_ACCESS ca
    WHERE 
        ca.CAN_ACCESS = true
        AND (
            (ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID = ?3)
            OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID = ?2 AND ca.TEAM_ID IS NULL)
            OR (ca.COMPANY_ID = ?1 AND ca.AREA_ID IS NULL AND ca.TEAM_ID IS NULL)
        )
    LIMIT 1;
    

    Esta consulta modificada recupera la primera coincidencia encontrada y deja de ejecutarse, utilizando la palabra clave LIMIT 1. Si no se encuentra ninguna coincidencia, la consulta no devolverá registros.

    Es importante tener en cuenta que la sintaxis específica de la consulta puede variar según la versión de SQL u Oracle que se esté utilizando.

Comments are closed.