Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/10/2012, 06:17
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Explicacion setencia Sql

Código MySQL:
Ver original
  1. SELECT p.id AS did,
  2.              p.*,
  3.              g.nombre as generonombre,
  4.              CASE WHEN CHAR_LENGTH(p.alias)
  5.                          THEN CONCAT_WS(":", p.id, p.alias)
  6.                          ELSE p.id END as slug,
  7.               CASE WHEN CHAR_LENGTH(g.alias)
  8.                         THEN CONCAT_WS(":", g.id, g.alias)
  9.                         ELSE g.id END as generoslug
  10. FROM #__documentos_subgeneros AS p
  11.           LEFT JOIN #__documentos_generos AS g ON g.id = p.idgenero'

Manual

Cita:
CHAR_LENGTH(str)

Retorna la longitud de la cadena de caracteres str, medida en caracteres. Un carácter de múltiples bytes cuenta como un sólo carácter. Esto significa que para una cadena de caracteres que contiene cinco caracteres de dos bytes, LENGTH() retorna 10, mientras CHAR_LENGTH() returna 5.
Cita:
CONCAT_WS(separator,str1,str2,...)

CONCAT_WS() significa CONCAT With Separator (CONCAT con separador) y es una forma especial de CONCAT(). El primer argumento es el separador para el resto de argumentos. El separador se añade entre las cadenas a concatenar. El separador puede ser una cadena como el resto de argumentos. Si el separador es NULL, el resultado es NULL. La función evita valores NULL tras el argumento separador.

mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
-> 'First name,Last Name'

En MySQL 5.0, CONCAT_WS() no evita cadenas vacías. (Sin embargo, evita NULLs.)
CASE WHEN condición
THEN si condición es cierta
ELSE si no es cierta
END

Parece que tu condicional esta incompleto puesto que CHAR_LENGTH(p.alias) no es en si mismo una condición, solo lo seria si el resultado de la función fuese un booleano (true/false), como puedes leer en el manual no es el caso.

Es mucho suponer pero si de lo que se trata es de evitar los problemas que pueda acarrear un NULL en el alias seria mucho mas logico hacer...


Código MySQL:
Ver original
  1. SELECT p.id AS did,
  2.              p.*,
  3.              g.nombre as generonombre,
  4.              CASE WHEN p.alias IS NOT NULL
  5.                          THEN CONCAT_WS(":", p.id, p.alias)
  6.                          ELSE p.id END as slug,
  7.               CASE WHEN g.alias IS NOT NULL
  8.                         THEN CONCAT_WS(":", g.id, g.alias)
  9.                         ELSE g.id END as generoslug
  10. FROM #__documentos_subgeneros AS p
  11.           LEFT JOIN #__documentos_generos AS g ON g.id = p.idgenero'

Donde si tienes una condició alias IS NOT NULL

O simplemente

IF(g.alias IS NOT NULL,CONCAT_WS(":", g.id, g.alias),g.id) as generoslug'


CONCAT_WS(":", g.id, g.alias) con comillas dobles y sin la \ tambien funcionaria
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 08/10/2012 a las 06:33