5/4/2014

TSQL y Seovolución

Hola gente!!

Este es un pequeño post que sale de la lógica del blog, pero sirve para ayudar a la aventura de posicionar seovolución en el concurso seo de forobeta organizado por Carlos Arreola.

Una breve explicación del propósito:
Forobeta organizó por segundo año consecutivo un concurso de posicionamiento web en el cual el reto consiste en posicionar en el primer lugar de google tu sitio para la palabra seovolución.

Cómo esta tarea es muy difícil y hay muchos participantes de peso se vuelve algo titánico lograr el objetivo.

Por eso, además de generar contenido permanentemente en el sitio participante, cómo primer arma de posicionamiento, la idea es conseguir enlaces que ayuden a mejorar el posicionamiento, inicialmente en Argentina y si se puede, también en el resto de los buscadores.

Bueno, esta es la explicación breve de este post.

Es solo una pequeña ayuda para posicionar seovolución.

Esperemos que de resultados positivos. Si no lo llegase a dar, por lo menos se intentó hasta el final y es lo que cuenta, intentar y no abandonar.

Saludos

16/6/2013

T-SQL y la lógica ternaria o trivalor

Cuando una persona empieza a programar con el lenguaje SQL, comienza con la selección de datos usando SELECT. Luego filtra los resultados usando WHERE, y en primera instancia esto parece una tarea fácil y trivial. Pero cuando empezamos a trabajar más con SQL nos chocamos con aspectos no tan obvios, cómo el manejo de NULL.

Supongamos que tenemos los siguientes datos

CREATE TABLE Ternaria
(
    Id INT Identity(1,1) NOT NULL
    ,Nombre VARCHAR(255) NOT NULL
    ,Pais VARCHAR(255) NOT NULL
    ,Ciudad VARCHAR(255) NULL
)

INSERT INTO Ternaria
  (
    Nombre
    ,Pais
    ,Ciudad
  )
VALUES
  (
    'Leo'
    ,'Argentina'
    ,'San Isidro'
  )
  ,(
    'Juan'
    ,'Argentina'
    ,'Olivos'
  )
  ,(
    'Pedro'
    ,'Argentina'
    ,'Ciudadela'
   )
  ,(
    'Matias'
    ,'Brasil'
    ,NULL
  )
  ,(
    'Marcos'
    ,'Brasil'
    ,'Rio de Janeiro'
  )

El resultado de una consulta de selección sin filtros es el siguiente:

SELECT
    Id
    ,Nombre
    ,Pais
    ,Ciudad
FROM
    Ternaria

ID NOMBRE PAIS CIUDAD
1 Leo Argentina San Isidro
2 Juan Argentina Olivos
3 Pedro Argentina Ciudadela
4 Matias Brasil (null)
5 Marcos Brasil Rio de Janeiro

Veamos dos ejemplos para entender la lógica ternaria:
Primero filtramos por el campo Pais, obteniendo lo siguiente:

SELECT
    Id
    ,Nombre
    ,Pais
    ,Ciudad
FROM
    Ternaria
WHERE
    Pais = 'Argentina'

IDNOMBREPAISCIUDAD
1LeoArgentinaSan Isidro
2JuanArgentinaOlivos
3PedroArgentinaCiudadela

Segundo filtramos por el campo ciudad, obteniendo lo siguiente:

SELECT
    Id
    ,Nombre
    ,Pais
    ,Ciudad
FROM
    Ternaria
WHERE
    Ciudad <> 'Rio de Janeiro'
    AND Pais = 'Brasil'

IDNOMBREPAISCIUDAD

Si prestamos atención, esta segunda query genera un resultado erróneo, ya que si existe en la tabla, aunque sea, un registro que cumpla con la condición de que el Pais sea Brasil y la ciudad sea distinta a Rio de Janeiro.

Ahora bien, si existe aunque sea un registro, porqué no se muestra?

Aquí es donde aparece la lógica basada en tres valores. Si comparamos dos valores iguales obtenemos Verdadero (True), si comparamos dos valores distintos obtenemos Falso (False), pero si comparamos un valor con un Null, obtenemos Desconocido (Unknown) y este último valor obtenido no es ni Verdadero ni Falso, por ende se excluye en las comparaciones.

Observación: Ni siquiera la comparación entre Nulls es Verdadera o Falsa, sino Desconocido.

Podemos solucionar este inconveniente de la siguiente manera:

SELECT
    Id
    ,Nombre
    ,Pais
    ,Ciudad
FROM
    Ternaria
WHERE
    (Ciudad <> 'Rio de Janeiro' OR Ciudad IS NULL)
    AND Pais = 'Brasil'

IDNOMBREPAISCIUDAD
4MatiasBrasil(null)