2010-04-23 17 views
8

Estoy tratando de no reinventar la rueda aquí ... tengo estos cuatro campos:nombre, segundo nombre, apellido y sufijo inicial en T-SQL (Sin espacios adicionales)

[tbl_Contacts].[FirstName], 
[tbl_Contacts].[MiddleInitial], 
[tbl_Contacts].[LastName], 
[tbl_Contacts].[Suffix] 

And I desea crear un campo FullName en una vista, pero no puedo tener espacios adicionales si los campos están en blanco ...

Así que no puedo hacer FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix... Porque si no hay inicial o sufijo en el centro, tendría 2 espacios extra en el campo. Creo que necesito una declaración de caso, pero pensé que alguien tendría un método práctico para esto ... Además, el m iddleinitial y el suffix pueden ser nulos.

Respuesta

21

Suponiendo que todas las columnas podrían ser anulable, se puede hacer algo como:

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleInitial + ' ', '') 
+ Coalesce(LastName + ' ', '') 
+ Coalesce(Suffix, '')) 

Esto se basa en el hecho de que agregar un valor NULL produce un NULL.

8

Es posible que desee pasar la concatenación FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix a través de la función REPLACE() para sustituir espacios duplicados en un solo espacio.

REPLACE(FirstName + ' ' + MiddleInitial + ' ' + LastName + ' ' + Suffix, ' ', ' ') 
--                  -- - 

EDIT:

di cuenta de que algunos de sus campos puede ser NULL, y por lo tanto lo anterior no funcionaría en ese caso, como a toda la cadena se convertiría en NULL. En este caso, se puede utilizar el COALESCE()method as suggested by Thomas, pero todavía envuelto en un REPLACE():

REPLACE(RTRIM(COALESCE(FirstName + ' ', '') + 
       COALESCE(MiddleInitial + ' ', '') + 
       COALESCE(LastName + ' ', '') + 
       COALESCE(Suffix, '')), ' ', ' ') 

prueba:

SELECT REPLACE(RTRIM(COALESCE('John' + ' ', '') + 
        COALESCE('' + ' ', '') + 
        COALESCE('Doe' + ' ', '') + 
        COALESCE(NULL, '')), ' ', ' ') 

-- Returns: John Doe 
+0

Aún puede usar la función 'REPLACE' junto con la función' ISNULL', ¿no? – Ben

11

Cualquiera que sea la opción que elija, aquí hay algo en qué pensar: esta será una opción bastante complicada y lenta, especialmente si la tiene en una vista que se evalúa todas y cada una de las filas en cuestión.

Si necesita esta frecuencia, recomendaría agregar esto a su tabla de base como un campo persistió computarizada - algo así como:

ALTER TABLE dbo.tbl_Contacts 
    ADD FullName AS (insert the statement of your choice here) PERSISTED 

Cuando se persistió, se convierte en parte de la tabla subyacente, y es almacenado y actualizado por SQL Server. Cuando se consulta, se obtiene de vuelta el valor actual y sin incurrir en el coste de tener que concatenar juntos los campos y determinar cuál utilizar y cuáles ignorar ...

Sólo algo en que pensar - algo que muchos Los desarrolladores de DBA y de bases de datos tienden a ignorar y/o no saber sobre ...

+0

Guau ... Eso suena como una buena idea, gracias – Paul

+1

Nunca he sabido de la palabra clave Persisted. Gracias :-) +1 – Raja

+1

También soy fan de estas columnas. Compruébelo una vez (y si los datos subyacentes cambian) y luego úselo, no lo resuelva cada vez que ejecute la consulta. – HLGEM

0

Aquí es una solución:

CREATE FUNCTION dbo.udf_IsNullOrEmpty 
(
@vchCheckValue VARCHAR(MAX) 
,@vchTrueValue VARCHAR(MAX) 
,@vchFalseValue VARCHAR(MAX) 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 

RETURN CASE WHEN NULLIF(RTRIM(LTRIM(@vchCheckValue)),'') IS NULL THEN @vchTrueValue ELSE @vchFalseValue END 

END 

SELECT FirstName + ' ' + 
     dbo.udf_IsNullOrEmpty(MiddleInitial,'',MiddleInitial + ' ') + 
     LastName + 
     dbo.udf_IsNullOrEmpty(Suffix,'',' ' + Suffix) 
FROM tbl_Contacts 
+0

Puede ser nulo o puede estar en blanco – Paul

-1

crear la función getfname (varchar @ n (30)) vuelve varchar (30) como comienzan varchar declarar @s (30) conjunto @ s = LEFT (@ n, charindex ('', @ n) -1) retorno @s extremo

crear función getLname (varchar @n (30)) rendimientos varchar (30) como comenzar declare @s varchar (30)

conjunto @ s = subcadena (@ n, charindex ('', @ n + 1), Len (@n))

retorno @s extremo

0

Tuve que unirme a Firstname, Middlename y Lastname. Mi desafío fue manejar los valores NULL, utilizado el siguiente código.

RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,''))) 

diferentes escenarios de prueba si están interesados ​​:)

DECLARE @firstname VARCHAR(MAX) 
DECLARE @middlename VARCHAR(MAX) 
DECLARE @lastname VARCHAR(MAX) 

set @firstname = 'FirstName' 
set @middlename = NULL 
set @lastname = 'LastName' 

SELECT '|'+RTRIM(LTRIM(RTRIM(isnull(@firstname,'') + ' ' + isnull(@middlename,'')) + ' ' + isnull(@lastname,'')))+'|' 
-- 
0

Si está utilizando SQL Server 2012+ podría utilizar CONCAT y +:

SELECT RTRIM(
     CONCAT(FirstName + ' ', MiddleInitial + ' ', LastName + ' ', Suffix) 
    ) AS [FullName] 
FROM tbl_Contacts; 

Cómo funciona:

  1. Si alguna parte del nombre completo es NULL continuación NULL + ' 'NULL
  2. CONCAT maneja NULL
  3. En caso de que después de parte del nombre sólo hay NULLs, TRIM último espacio.

LiveDemo

0

seleccione CONCAT (IFNULL (FirstName, ''), '', IFNULL (MiddleName, ''), '', IFNULL (LastName '',)) COMO nombre de la tabla

Cuestiones relacionadas