Desarrollando en Cobol y Natural sobre Plataforma Mainframe

jueves, 2 de abril de 2015

Sentencia SQL SELECT WHERE 0=1 para DB2

Aunque en un primer momento pueda resultar extraño, no son pocas las veces en las que nos vamos a encontrar, en el acceso a DB2, con una sentencia SELECT en cuya cláusula WHERE aparece la estructura 0 = 1. Esto se suele utilizar cuando necesitamos producir una condición de resultado FALSE.

En general, la cláusula WHERE 0 = 1 es empleada por los programadores Cobol DB2 cuando se precisa generar un resultado FALSE en alguna sentencia SQL. Al realizar el mantenimiento del programa nos resultará extraño encontrarnos con ella, pero en realidad dicha configuración no tiene mayor relevancia.



Por ejemplo, aquí en Universocobol.com os mostramos, simplificada, la sentencia SELECT que nos encontramos hace algunas semanas en uno de nuestros clientes.

SELECT SITUACION, PEDIDO, MATERIAL,
       COORDX, COORDY, TIPO_MATERIAL
FROM JJPEDIT0
WHERE (SITUACION = :W-SITUACION OR 0 = 1)


El SELECT anterior mostrará todos los registros con SITUACION igual al contenido de la variable W-SITUACION. En realidad, la segunda parte del WHERE no tendría ninguna influencia en el resultado final: la condición 0 = 1 siempre equivaldrá a FALSE y, por tanto, la SELECT sólo mostrará los registros que cumplan la primera parte de la sentencia OR (es decir, aquellos con SITUACION = :W-SITUACION).

¿Y qué ocurriría si, en vez del operador OR, empleásemos el operador AND en la cláusula WHERE? Recordemos que 0 = 1 equivale a FALSE y, por tanto, en esta ocasión el impacto sobre el resultado de la sentencia SELECT sería mucho más importante que en el primer caso.

El ejemplo anterior quedaría de la siguiente forma. Ahora el SELECT estaría acompañado por un WHERE que contiene el operador AND.

SELECT SITUACION, PEDIDO, MATERIAL,
       COORDX, COORDY, TIPO_MATERIAL
FROM JJPEDIT0
WHERE (SITUACION = :W-SITUACION AND 0 = 1)


¿Cuál sería el resultado aquí? Pues con esta instrucción el SELECT no podrá devolver ningún registro. La segunda parte del AND siempre será FALSE y, por tanto, nunca se podrá cumplir la condición completa del WHERE, independientemente del resultado de la primera parte (SITUACION = :W-SITUACION).

El uso de esta segunda estrategia (AND en vez de OR) es mucho más restringido, ya que dicha configuración sólo tendrá utilidad cuando queramos que el resultado de una SELECT sea nulo. Se puede emplear para generar algún tipo de prueba específico, pero en pocas situaciones más.



Como vemos, en las sentencias SQL de un programa Cobol nos podemos encontrar con estructuras bastante extrañas en un SELECT. Cuando esto nos ocurra, lo importante es pensar con lógica y determinar qué es lo que se obtendría con la ejecución de la instrucción. Una vez que tengamos claro ese punto, el problema se solucionará tarde o temprano.

Esperamos que lo comentado en el post os sirva, al menos, para disminuir la sorpresa si, en alguna ocasión, os encontráis con un WHERE 0 = 1 en algún programa.

Saludos.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...