2011-11-26 19 views
5

Tengo los siguientes datos de referencia.SQL Select; Concatenando cadenas, evitando comas dobles donde las columnas son nulas?

PERSON_NAME     STREET     TOWN    COUNTY   POSTCODE 
------------------------------ ------------------------ ---------------- ---------------- ---------- 
David Smith     30 Johnson Street  Norwich   Norfolk   NA38 3KL 
John Brown      Douglas Road    Cambridge       C8 9IJ  
Jackie White     8 High Street   Ipswich   Suffolk   IP7 2YT 
Andrea Blue     9 Marlborough Ave  Bury    Suffolk   IP4 0XC 
Jemima Green     Riverside Walk   Colchester  Essex   CO6 7PR 
James Gray      167 Hadleigh Place  London       SW1 4TU 

Lo que yo quiero hacer, es para mostrar una lista de nombres de personas, junto con sus direcciones concatenan en una cadena separada por comas.

Esta parte es fácil, he usado el || para concat columnas y coloco separadores de coma.

La parte en la que estoy en cuestión es el hecho de que algunas filas no tienen nada en la lista para COUNTY, por lo tanto, debo evitar mostrar , ,.

He hecho algunas investigaciones por mí mismo, y he decidido usar el SUBSTR en Oracle para reemplazar las comas dobles, sin embargo, me siento un poco "sucio". ¿Hay una manera más clara de hacerlo, evitando el uso de funciones complejas (como this previous SO question)?

Esto es lo que tengo:

SELECT 
    SUPPNAME as "Supplier Name", 
    REPLACE(STREET || ', ' || TOWN || ', ' || COUNTY || ', ' || POSTCODE, ' ,','') as "Supplier Address" 
FROM 
    SUPPLIERS 
; 

Gracias

Respuesta

7

intenta

SELECT 
SUPPNAME AS "Supplier Name", 
(
CASE WHEN STREET IS NULL THEN '' ELSE STREET || ', ' END || 
CASE WHEN TOWN IS NULL THEN '' ELSE TOWN || ', ' END || 
CASE WHEN COUNTY IS NULL THEN '' ELSE COUNTY || ', ' END || 
CASE WHEN POSTCODE IS NULL THEN '' ELSE POSTCODE END 
) AS "Supplier Address" 
FROM SUPPLIERS 
+2

He eliminado mi respuesta porque he encontrado que, en concats cadena de Oracle con nulos no producir un nulo (como creo que lo hace en SQL Server), tal como lo mencionaste Empecé a cambiar a las declaraciones de casos, pero luego vi su respuesta: +1 –

+0

+1. @Yahia - Acabas de salvarme un gran dolor de cabeza. ¡Gracias! –

2

usted podría utilizar NVL2 alrededor de los campos que podrían ser nula, algo como NVL2(county, county || ',', '')

3

En respuestas anteriores si todos los campos son NULL, entonces obtendrás solo estúpido ',' en cambio, esperaba NULL. Pruebe este enfoque para eliminar una extra '' al comienzo del resultado

SELECT 
SUPPNAME AS "Supplier Name", 
SUBSTR(
    NVL2(STREET, ', ' || STREET, NULL) 
     || NVL2(TOWN, ', ' || TOWN, NULL) 
     || NVL2(COUNTY, ', ' || COUNTY, NULL) 
     || NVL2(POSTCODE, ', ' || POSTCODE, NULL) 
    ,2) AS "Supplier Address" 
FROM SUPPLIERS 
+0

Esto funcionó perfectamente para mí y evité seguir comas. – user2710915

Cuestiones relacionadas