8
votes

Espaces lors de la concaténation de plusieurs colonnes et une colonne est NULL - Oracle

J'ai besoin de concaténer plusieurs colonnes en une, avec des espaces entre chaque valeur. Le problème est quand une valeur est null, je me retrouve avec un double espace entre deux valeurs.

Exemple xxx

Si le deuxième prénom se trouve être null, je me retrouve avec deux espaces entre le premier et le nom de famille. Toute façon de contourner cela et d'avoir un seul espace quand il y a une valeur nulle?


0 commentaires

10 Réponses :


11
votes
SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAME) || ' ' || LAST_NAME)   
FROM TABLE_A; 

1 commentaires

Celui-ci est le plus correct, car l'approche acceptée ne suppose pas que les deux premiers arguments puissent être nuls.



1
votes

Vous pouvez utiliser RPAD () à ajouter dans le caractère espace: xxx

Lorsque l'un des paramètres de RPAD est NULL, le résultat sera null et à Oracle Ajout Null à une chaîne retourne la chaîne d'origine.


0 commentaires

0
votes

Une autre option consiste à utiliser décodage: xxx


3 commentaires

J'ai fini par utiliser la méthode NVL () que vous aviez postée auparavant. J'ai trouvé que la table avait des valeurs blanches (ou j'ai donc pensées) mais j'ai eu un espace, de sorte que ces lignes jouaient avec moi


...Je reprends ça. Je devais incorporer le décodage comme dans ce qui précède. Merci pour l'aide


Étant donné que '' est null en oracle, les appels nvl n'ajoute ici rien de valeur. "Si NUMED_NAME est NULL, renvoyez NULL, sinon renvoyer le nom_fry_name" est identique à "renvoyer le nom_fr.Name".



0
votes

Encore une autre option:

SELECT first_name
       || DECODE(middle_name
          ,      NULL, NULL
          ,      ' ' || middle_name)
       || DECODE(last_name
          ,      NULL, NULL
          ,      ' ' || last_name) full_name
FROM   table_a
;


2 commentaires

Si Middle_Name ou Last_Name est une chaîne vide (c'est-à-dire ') - ça ne fonctionne pas correctement ...


À Oracle, ça va; Oracle ne distingue aucune distinction entre la chaîne vide et null .



3
votes
with indata as
(
select 'John' as first_name, 'W' as middle_name, 'Smith ' as last_name from dual
union
select null as first_name, null as middle_name, 'Adams' as last_name from dual
union
select 'Tom' as first_name, null as middle_name, 'Jefferson' as last_name from dual
)
select
regexp_replace(trim(indata.first_name || ' ' || indata.middle_name || ' ' || indata.last_name), '\s{2,}', ' ')
from indata;

1 commentaires

Ha! Juste pour poster la méthodologie Regexp_replace!



0
votes

ou vous pouvez simplement utiliser la fonction Remplacer: xxx

(et merci à @tbone pour l'exemple de données: -)


0 commentaires

5
votes

de la documentation de l'oracle:

concat_ws (séparateur, str1, str2, ...)

concat_ws () représente un concaténate avec séparateur et est une spéciale forme de concat (). Le premier argument est le séparateur du reste de les arguments. Le séparateur est ajouté entre les cordes à être concaténé. Le séparateur peut être une chaîne, de même que le reste de la arguments. Si le séparateur est null, le résultat est null.

et le commentaire très important:

concat_ws () ne saute pas les chaînes vides. Cependant, il saute tout Valeurs null après l'argument de séparateur.

Donc, dans votre cas, il devrait être: xxx


1 commentaires

Corrigez-moi si je me trompe mais concat_ws () est disponible dans MySQL et non oracle rdbms.



2
votes

C'est ainsi que j'ai généralement concaténé plusieurs champs et éliminez WhitSpace dans Oracle:

garniture (Regexp_replace (house_no || '' || préfixe || '' || Nom de rue || '' || '|| Street_type ||' '|| suffixe,' + '' || '))

  1. concaténer tous les champs nécessaires avec un espace entre chacun. Les chaînes vides et les valeurs nulelles entraîneront un ou plusieurs espaces ou plus;
  2. Utilisez une expression régulière pour modifier toutes les occurrences de plusieurs espaces ['+'] à un seul espace [''];
  3. Enfin, coupez tout espace blanche au début et / ou à la fin de la chaîne résultante.

1 commentaires

J'ai utilisé Regexp_replace de ce problème mais j'ai fait comme Regex_replace (, '\ s {2,}' ',' ') à rechercher 2 espaces de 2 ou plus dans une rangée.



0
votes

J'ai ce travail avec l'exemple. J'espère que cela t'aides. Il suffit d'aller sur SQL Server, sélectionnez Nouvelle requête et CP Query suivant:

DECLARE @NULL_SAMLES TABLE
       (
       NS_ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL
      ,COL_01 VARCHAR(10) NULL
      ,COL_02 VARCHAR(10) NULL
      ,COL_03 VARCHAR(10) NULL
      ,COL_04 VARCHAR(10) NULL
   )

   INSERT INTO @NULL_SAMLES(COL_01,COL_02,COL_03,COL_04)
   VALUES
    ('A','B','C','D')
   ,(' ' ,'B','C','D')
   ,(' ',NULL,'C','D')
   ,('A','B',NULL,'D')
   ,('A','B','C',NULL)
   ,(NULL,'B',NULL,'D')
   ,(NULL,'B','C',NULL)
   ,('A',NULL,'C',NULL)
   ,('A',NULL,NULL,'D')
   ,('A',NULL,NULL,NULL)
   ,(NULL,'B',NULL,NULL)
   ,(NULL,NULL,'C',NULL)
   ,(NULL,NULL,NULL,'D')


   SELECT
        NS.COL_01
       ,NS.COL_02
       ,NS.COL_03
       ,NS.COL_04,
      Stuff(  
        Coalesce(', ' + nullif(NS.COL_01, ''), '') 
      + Coalesce(', ' + nullif(NS.COL_02, ''), '') 
      + Coalesce(', ' + nullif(NS.COL_03, ''), '') 
      +Coalesce(', ' + nullif(NS.COL_04, ''), '')
      , 1, 1, '') AS CONC_COLS
   FROM @NULL_SAMLES NS


0 commentaires

0
votes

Ne sous-estimez pas la puissance simple de la déclaration de cas, qui peut être concaténée. Voici un exemple autonome que vous pouvez exécuter tel quel:

SELECT
CASE WHEN x.FIRST_NAME IS NULL THEN x.FIRST_NAME ELSE x.FIRST_NAME || ' ' END || 
CASE WHEN x.MIDDLE_NAME IS NULL THEN x.MIDDLE_NAME ELSE x.MIDDLE_NAME  || ' ' END || 
x.LAST_NAME
FROM (SELECT 'John' AS FIRST_NAME, NULL AS MIDDLE_NAME, 'Doe' AS LAST_NAME FROM DUAL) x;


0 commentaires