2011-02-10 15 views
8

Si en una instrucción SELECT selecciono una cadena concatenada que usa los valores de las tablas de las que estoy seleccionando, ¿cuál es la mejor manera de manejar NULLs? para esos valores para que yo todavía tenga mi cadena? Al igual que en, si estoy seleccionando la ciudad, estado y país para un usuario, y quiero un tercer campo que los concatena todo:T-SQL: la mejor manera de manejar valores NULL en la concatenación de cadenas

SELECT City, State, Country, 
City + ', ' + State + ', ' + Country AS 'Location' 
FROM Users 

Sin embargo, 'Localización' es nulo si cualquiera de los tres campos es NULL (que sucede siempre que el usuario no sea de los EE. UU.).

Mi solución actual es la siguiente:

SELECT City, State, Country, 
City + ', ' + COALESCE(State + ', ', '') + Country AS 'Location' 
FROM Users 

Pero no estaba seguro de si esto era sólo un truco y si hay una mejor manera de hacerlo. ¿Pensamientos?

+2

'coalesce' es una práctica estándar para esto. En tu caso, solo necesitarías 'isnull'. posible duplicado de [SQL Server String Concatenation with Null] (http://stackoverflow.com/questions/2916791/sql-server-string-concatenation-with-null) btw – bzlm

+0

@bzlm ¡Vaya! Tienes razón. No estoy seguro de por qué no apareció cuando busqué o ingresé el título. Quizás porque puse específicamente "t-sql". Votando para cerrar. Siempre es un poco extraño votar para cerrar tu propia pregunta. Hace cosquillas. – JoeCool

+0

@bzlm La respuesta sobre la pregunta "duplicada" no me entusiasma. No aborda los delimitadores entre las columnas. – RichardTheKiwi

Respuesta

13

Para buscar previsiblemente correcta con comas entre cada dos campos, puede utilizar esta forma

;with users(City, State, Country) as (
select 'a', null, 'c' union all 
select 'a', 'b', 'c' union all 
select null, null, 'c') 

-- ignore above this line 
SELECT City, State, Country, 
    STUFF(
     ISNULL(', ' + City, '')+ 
     ISNULL(', ' + State, '')+ 
     ISNULL(', ' + Country, ''), 1, 2, '') AS 'Location' 
FROM Users 

salida

City State Country Location 
---- ----- ------- -------- 
a NULL c  a, c 
a b  c  a, b, c 
NULL NULL c  c 
+0

+1; no había considerado la posibilidad de que los valores medios fueran nulos, lo que parece bastante obvio en retrospectiva. –

+0

@Adam ¡Dios bendiga 20/20 en retrospectiva! – RichardTheKiwi

+0

Estoy un poco confundido: ¿son necesarias las cosas anteriores "ignorar arriba de esta línea" para que la consulta funcione? – JoeCool

2

Sí, ese es el camino a seguir. También podría usar isnull() pero coalesce es más estándar. También podría considerar si podría tener nulos en la ciudad o en el país. También podría considerar que los usuarios pueden tener direcciones multipel y pueden tener más de una ciudad, estado, país y quizás una tabla relacionada sería mejor para esta información.

+1

Más estándar? Cita requerida – bzlm

+1

@bzlm: Si bien no iría tan lejos como para decir que es "más estándar" (en términos de tasa de adopción), pero generalmente es la sintaxis preferida para el nuevo desarrollo, dado que cubre todos los casos que cubre 'ISNULL', así como otros (encadenando opciones adicionales que habrían requerido múltiples declaraciones 'ISNULL', por ejemplo). Además, 'COALESCE' está disponible en SqlCE, mientras que' ISNULL' no lo es. –

+2

@ Adam, @Bzlm a menos que estemos tratando con SQLCE, no tiene sentido arrastrarlo. Por cierto, COALESCE tiene algunos problemas de tipado y rendimiento dinámicos en comparación con IsNull, por lo que si está en SQL Server (no CE) y solo necesita 2 valores, no se aventure en COALESCE innecesariamente. – RichardTheKiwi

3

Puede utilizar la función de concatenación en SQL 2012 y más tarde

SELECT City, State, Country, 
Concat(City, ', ', State, ', ', Country) AS 'Location' 
FROM Users 
Cuestiones relacionadas