Columna SQL
Resumen de conocimientos básicos de la base de datos SQL
Resumen del conocimiento avanzado de la base de datos SQL
problema
Cuando hacemos estadísticas de datos, a menudo nos encontramos con situaciones en las que necesitamos dividir por un cierto número, como buscar porcentajes, relaciones en cadena, año tras año, etc. Si el divisor es 0, la base de datos informará un error .
Entonces, ¿cómo lidiamos con tal situación? Usemos un ejemplo para explicar cómo lidiar con eso.
Solución
Situación uno
P.ej
SELECT A/B FROM TAB
En tal situación, el enfoque general es utilizar CASE WHEN para determinar el valor de B
SELECT
CASE WHEN B=0 THEN 0 ELSE A/B END
FROM TAB
De esta manera, si B es 0, asignamos directamente un valor para evitar que A / B participe en el cálculo y reporte errores.
Situación dos
Lo anterior es una situación común, pero ¿qué sucede si encuentra la siguiente función agregada?
P.ej
SELECT SUM(A)/COUNT(B) FROM TAB
En tal situación, CASE WHEN no puede juzgar el valor de COUNT (B), porque las condiciones detrás de WHEN no pueden usar funciones agregadas (requisitos de sintaxis). En este momento, podemos tratarlo así
SELECT
ISNULL(SUM(A)/NULLIF(COUNT(B),0),0)
FROM TAB
Aquí se utilizan dos funciones, NULLIF () e ISNULL ()
La función NULLIF tiene dos parámetros, que se definen de la siguiente manera:
NULLIF (expresión1, expresión2)
Su función es: si las dos expresiones especificadas son iguales, devuelve un valor NULO.
La función ISNULL también tiene dos parámetros, que se definen de la siguiente manera:
ISNULL (expresión1, expresión2)
Su función es: si el resultado del primer parámetro es NULL, se devuelve el valor del segundo parámetro.
Cuando el resultado de COUNT (B) es 0, es exactamente igual al segundo parámetro dado 0. En este momento, la función NULLIF devolverá NULL, y el resultado de SUM (A) cuando se divide por NULL es NULL, y el la capa externa usa ISNULL La función juzga el valor NULL, por lo que el resultado final es 0.
Estos dos métodos son nuestro manejo diario de la situación en la que el divisor es 0, por lo que debemos recordar ~