Ejemplo Nº 022 – Condiciones más complejas en la cláusula WHERE

1 comentario

Las cláusulas WHERE pueden llegar a ser muy complejas si se combinan varios operadores AND y OR.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PRECTO,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_PRECTO > 1000 AND (
   PRD_PREVTA >= 50000 OR
   EXTRACT(YEAR FROM PRD_FECHAX) = 2012)

Cuando se trata de una condición compleja lo más recomendable es siempre usar paréntesis para asegurarse que el orden de evaluación sea el deseado.

Por ejemplo, en este caso:

Condición1 AND Condición2 OR Condición3

¿cómo lo evalúa el Firebird, como:
(Condición1 AND Condición2) OR Condición3
o como:
Condición1 AND (Condición2 OR Condición3)
?

Para evitar confusiones y errores difíciles de detectar es mejor usar siempre paréntesis.

Ejemplo Nº 021 – Usando la cláusula WHERE con el operador NOT y la palabra clave IN

1 comentario

El operador NOT sirve para negar una condición.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_UNIMED NOT IN ('KLG', 'LTS', 'MTS')

Este SELECT nos mostrará los productos cuya Unidad de Medida no sea ni Kilogramos ni Litros ni Metros.

Ejemplo Nº 020 – Usando la cláusula WHERE con la palabra clave IN

1 comentario

En lugar de estar usando el operador OR varias veces suele ser preferible usar la palabra clave IN en su lugar, como vemos a continuación:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_PREVTA IN (1000, 2000, 3000, 4000)

Que es equivalente a escribir este otro SELECT:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_PREVTA = 1000 OR
   PRD_PREVTA = 2000 OR
   PRD_PREVTA = 3000 OR
   PRD_PREVTA = 4000

Como ves, usando la palabra clave IN se ahorra escritura. Además, al ser más larga la segunda forma es más propensa a errores. Por esos motivos, en lugar de estar escribiendo varios OR es preferible escribir un solo IN.

 

 

 

Ejemplo Nº 019 – Usando la cláusula WHERE con el operador OR

1 comentario

El operador OR se utiliza cuando se requiere que se cumpla al menos una de las dos condiciones.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
WHERE
   PRD_CODIGO = 12 OR
   PRD_CODIGO = 25

En este ejemplo veremos los productos cuyos Código sean 12 ó 25 (si ambos existen, se los verá a ambos. Si uno sólo existe, se lo verá a ese. Si ninguno existe, nada se verá).

No es obligatorio que el operador OR relacione a la misma columna, podrían ser también columnas distintas como se ve a continuación:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
WHERE
   PRD_CODIGO = 12 OR
   PRD_PREVTA > 6000

Aquí veremos los datos del producto cuyo Código es 12 (si es que existe) y también los datos de todos los productos cuyo precio de venta sea mayor que 6.000 (si es que existen productos con precios de venta mayores que 6.000)

Ejemplo Nº 018 – Usando la cláusula WHERE con el operador AND

1 comentario

El operador AND se utiliza cuando se requiere que se cumplan dos o más condiciones.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_PREVTA >= 10000 AND
   PRD_PREVTA <= 50000

No es obligatorio que el operador AND relacione siempre a la misma columna, también pueden usarse columnas distintas, como se muestra abajo:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_CODIGO >= 200  AND
   PRD_PREVTA <= 50000 AND
   PRD_PROCED = 'I'

En este caso, nos muestra todos los productos cuyo Código es igual o mayor que 200, su Precio de Venta es menor o igual que 50.000 y son de procedencia “Importados”.

El operador AND se utiliza cuando deben cumplirse todas las condiciones.

 

 

 

 

Ejemplo Nº 017 – Usando la cláusula WHERE para imponer condiciones

1 comentario

Solamente las filas que cumplan con la condición impuesta en el WHERE se mostrarán. La cláusula WHERE siempre debe escribirse a continuación de la cláusula FROM.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_PREVTA < 10000

Este SELECT nos mostrará los Códigos, Nombres y Precios de Venta de todos los productos cuyos precios de venta sean menores que 10.000

La cláusula WHERE es la que impone la condición (o condiciones) que deseamos y así limitamos las filas que serán mostradas por el SELECT.

 

Ejemplo Nº 016 – Usando el CASE de búsqueda

1 comentario

Con el CASE de búsqueda se pueden usar varias columnas, no solamente una columna como ocurre con el CASE simple.

Supongamos que queremos otorgarles descuentos a nuestros clientes según los productos que vendemos. Si son importados nuestros descuentos serán del 5%, y si son nacionales y el precio de venta es mayor que 300.000 entonces el descuento será del 4%, en los demás casos es del 0%. El siguiente SELECT nos permite conocer el porcentaje de descuento de cada producto.

En la columna PRD_PROCED se guarda la procedencia del producto. I = importado, N = nacional.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   CASE
      WHEN PRD_PROCED = 'I' THEN 5
      WHEN PRD_PREVTA > 300000 THEN 4
      ELSE 0
   END AS PORCENTAJEDESCUENTO
FROM
   PRODUCTOS

En el CASE de búsqueda se puede usar más de una columna, como lo muestra el ejemplo de arriba.

Se coloca un ELSE para indicar lo que se debe hacer cuando ninguna de las condiciones anteriores se cumple.

 

 

 

 

 

Ejemplo Nº 015 – Usando el CASE simple

5 comentarios

En el CASE simple se evalúa una columna que es siempre la misma. De acuerdo al valor que tenga esa columna se realiza alguna acción, como podemos ver a continuación:

SELECT
   PER_IDENTI,
   PER_NOMBRE,
   CASE PER_ESTCIV
      WHEN 'S' THEN 'Soltera/o'
      WHEN 'C' THEN 'Casada/o'
      WHEN 'E' THEN 'Separada/o'
      WHEN 'D' THEN 'Divorciada/o'
      WHEN 'V' THEN 'Viuda/o'
   END
FROM
   PERSONAS

En la columna PER_ESTCIV guardamos una letra que representa al estado civil de una persona (S, C, E, D o V) pero en el SELECT no mostramos esa letra sino el nombre del estado civil (Soltera/o, Casada/o, Separada/o, Divorciada/o, Viuda/o) porque esto es mucho más entendible.

Fíjate que el CASE siempre debe finalizar con un END. Si no lo finalizas con un END el Firebird te mostrará un mensaje de error.

El SELECT anterior se puede mejorar agregándole un alias a la columna PER_ESTCIV para que sea más entendible:

SELECT
   PER_IDENTI,
   PER_NOMBRE,
   CASE PER_ESTCIV
      WHEN 'S' THEN 'Soltera/o'
      WHEN 'C' THEN 'Casada/o'
      WHEN 'E' THEN 'Separada/o'
      WHEN 'D' THEN 'Divorciada/o'
      WHEN 'V' THEN 'Viuda/o'
   END AS EstadoCivil
FROM
   PERSONAS

Recuerda: En el CASE simple siempre se evalúa una sola columna (en este ejemplo el nombre de esa columna es PER_ESTCIV)

Ejemplo Nº 014 – Usando la función EXTRACT() para obtener los componentes de una fecha

1 comentario

La función EXTRACT() sirve para que podamos conocer cual es el día de una fecha, cual es el mes de una fecha y cual es el año de una fecha. Por ejemplo, si la fecha es:

18/03/2013

con la función EXTRACT() podemos saber que el día es 18, el mes es 3 y el año es 2013.

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   EXTRACT(DAY FROM PRD_FECHAX),
   EXTRACT(MONTH FROM PRD_FECHAX),
   EXTRACT(YEAR FROM PRD_FECHAX)
FROM
   PRODUCTOS

En la columna PRD_FECHAX se guarda una fecha y la función EXTRACT() nos permite extraer de esa fecha el día, el mes y el año.

Sin embargo el SELECT anterior tiene un problema ¿y cuál es ese problema? que los nombres de las columnas extraídas serán EXTRACT, EXTRACT1 y EXTRACT2, los cuales no nos indican el contenido de dichas columnas. Un SELECT mucho mejor sería el siguiente:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   EXTRACT(DAY FROM PRD_FECHAX) AS DIA,
   EXTRACT(MONTH FROM PRD_FECHAX) AS MES,
   EXTRACT(YEAR FROM PRD_FECHAX) AS ANO
FROM
   PRODUCTOS

Aquí, los nombres de las columnas son mucho más entendibles (si no te gusta que la columna del año se llame ANO puedes llamarla ANHO o de cualquier otra forma que prefieras).

 

 

 

Ejemplo Nº 013 – La forma moderna de ver filas salteadas

1 comentario

En el ejemplo número 011 mostré como ver unas filas después de saltarse las primeras filas. Esa forma funciona y puede usarse si se desea pero es la forma antigua de hacerlo. La forma moderna es la siguiente:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_PREVTA
FROM
   PRODUCTOS
ROWS
   11 TO 16

Que nos mostrará las filas número 11, 12, 13, 14, 15 y 16.

Older Entries