Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   "(nombre + ' ' + apellidos)" no funciona (https://www.clubdelphi.com/foros/showthread.php?t=50742)

molina669 27-11-2007 11:01:50

"(nombre + ' ' + apellidos)" no funciona
 
Hola a tod@s,
tengo una consulta:
Código:

SELECT (USU.nombre + ' ' + USU.apellidos) as nombre, USU.extension,
USU.movilMasa, USU.departamento,
USU.extMovilMasa,DE.nombre AS departamento
FROM USUARIO USU,DEPARTAMENTO DE
WHERE USU.departamento=DE.codigo AND USU.fechaBaja IS NULL
ORDER BY USU.nombre

en la que el campo "nombre", si USU.apellidos esta vacio, no me devuelve nada. Me crea el registro pero ese campo está vacio. ¿A que se debe?

Gracias

duilioisola 27-11-2007 11:27:03

Podría ser que USU.nombre o USU.apellidos sea nulo.

Nulo concatenado con cualquier cosa es nulo
Nulo (+,-,*,/) cualquier cosa es nulo
Nulo (and,or,not,etc.) cualquier cosa es nulo

molina669 27-11-2007 11:31:30

Gracias duilioisola, efectivamente es nulo, pero no puedo evitar que lo sea. A veces es nulo y otras veces no, pero si es nulo necesito mostrar el nombre (sin el apellido).

Lepe 27-11-2007 11:35:57

¿qué base de datos usas? quizás puedas usar la estructura case when

Saludos

duilioisola 27-11-2007 11:57:17

Puede usar triggers para evitar que sea nulo:

En Firebir/Interbase:
Código SQL [-]
create trigger USUARIO_BI0 for USUARIO active before insert position 0
as
begin
   if (new.NOMBRE is null) then new.NOMBRE='';
   if (new.APELLIDO is null) then new.APELLIDO='';
end

molina669 27-11-2007 12:04:48

Access, estoy probando y parece que no lo acepta.

duilioisola 27-11-2007 12:32:26

De access no tengo ni idea ni quiero tener... :(

Creo que no tiene la posibilidad de triggers.
De todos modos, creo que hay un lugar, en donde se definen los campos que se puede marcar algo asi como "not null"

A pesar de todo esto, si estás programando en Delphi, el componente que utilices debe tener un evento OnNewRecord. Ahí puedes poner algo de código para controlar esto:

Código Delphi [-]
procedure Form1.TablaNewRecord(DataSet: TDataSet);
begin
  TablaNOMBRE.AsString := '';
  TablaAPELLIDO.AsString := '';
end;

De esta forma ya empiezas teniendo un string vacío y aunque no editen el DBEdit de Nombre o Apellido, el campo de la base ya tiene algo.

Nota: '' no es null

molina669 27-11-2007 13:00:35

Gracias a todos, encontré una forma de hacerlo en Access. Con la instrucción "Switch". El problema es que aplicado a Delphi no funciona, me salta un error "Argumento no valido". Les dejo el codigo:
Código:

SELECT switch(USU.apellidos is null,USU.nombre,
USU.apellidos is not null,USU.nombre + ' ' + USU.apellidos) as [nombre1],
USU.extension,
USU.movilMasa, USU.departamento,
USU.extMovilMasa,DE.nombre AS departamento
FROM USUARIO USU,DEPARTAMENTO DE
WHERE USU.departamento=DE.codigo AND USU.fechaBaja IS NULL
ORDER BY USU.nombre;

Ya pensé en la opción de duilioisola y la aplicaré si me ocupa mucho tiempo esto.

Gracias a tos

molina669 27-11-2007 13:40:22

Finalmente si que funciona el SQL de arriba

juanlaplata 07-12-2007 16:36:08

Otra alternativa para access puedes usar la funcion
iif(valorBoolean, SiEsVerdadero, SiEsFalso) entonces quedaria;

iif( isNull (USU.nombre), ' ', USU.nombre )



La franja horaria es GMT +2. Ahora son las 16:23:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi