7 votos

Instrucción del "Caso" de SQL cuando count(*) es 0

Estoy tratando de escribir el siguiente comando SQL utilizando el caso de la cláusula.

with x as
(select the_geom as geom from table1
where st_dwithin(the_geom, st_setsrid(st_makepoint(28.959495,41.019913), 4326), 0.00012) limit 1)
select case count(geom)
when 0
    then st_setsrid(st_makepoint(28.959495,41.019913), 4326)
when 1
    then st_closestpoint(x.geom, st_setsrid(st_makepoint(28.959495,41.019913), 4326))       
end as the_geom
from x group by geom

Como se puede ver debajo de la with cláusula, podría ser una fila o ninguna fila en el registro x. El código está funcionando bien, donde hay una fila en x pero cuando la x es nulo (es decir, count(geom) = 0), el when 0 operación es no ser ejecutado. Estoy obteniendo el siguiente resultado. output_1

Además, después de modificar mi código SQL, un poco como los siguientes (sólo el when 2 está cambiado!)

with x as
(select the_geom as geom from table1
where st_dwithin(the_geom, st_setsrid(st_makepoint(28.959495,41.019913), 4326), 0.00012) limit 1)
select case count(geom)
when 0
then st_setsrid(st_makepoint(28.959495,41.019913), 4326)
when 2
then st_closestpoint(x.geom, st_setsrid(st_makepoint(28.959495,41.019913), 4326))       
end as the_geom
from x group by geom

La salida es similar a la siguiente captura de pantalla cuando el count(geom) = 1. output_2

Consultas: 1. Cómo ejecutar el when 0 condición cuando el registro x está vacía? 2. ¿Cuál es la diferencia entre los dos SQL salidas (como se muestra en las capturas de pantalla)?

Gracias por el conocimiento.

6voto

Patrick Puntos 20392

Puede simplificar todo esto mediante el uso de coalesce , que selecciona el primer elemento no nulo en una lista, en este caso, ya sea el punto más cercano a usted buscar punto, (28.959495,41.019913), o el punto sí mismo.

with input_geom (geom) as 
   (select st_setsrid(st_makepoint(28.959495,41.019913), 4326)) 
select coalesce(
   (select st_closestpoint(pts.the_geom, ig.geom) 
      where st_dwithin(ig.geom, pts.the_geom, 0.00012))
    ,ig.geom) as geom 
 from table1 pts, input_geom ig limit 1;

Me he convertido su pregunta en su cabeza, poniendo la búsqueda del punto en la inicial declaración, como se trata de un término de búsqueda o un valor devuelto, por lo que se consigue que se refiere en ambas partes de la coalesce declaración.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X