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 p> 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? P> p>
10 Réponses :
SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAME) || ' ' || LAST_NAME) FROM TABLE_A;
Celui-ci est le plus correct, car l'approche acceptée ne suppose pas que les deux premiers arguments puissent être nuls.
Vous pouvez utiliser Lorsque l'un des paramètres de RPAD () code >
à ajouter dans le caractère espace: RPAD code> est NULL, le résultat sera null et à Oracle Ajout Null à une chaîne retourne la chaîne d'origine. P> p>
Une autre option consiste à utiliser décodage:
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 '' code> est null en oracle, les appels
nvl code> 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".
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 ;
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 code>.
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;
Ha! Juste pour poster la méthodologie Regexp_replace!
ou vous pouvez simplement utiliser la fonction Remplacer: (et merci à @tbone pour l'exemple de données: -) p> p> P>
de la documentation de l'oracle:
concat_ws (séparateur, str1, str2, ...) p>
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. P> blockQuote>
et le commentaire très important: P>
concat_ws () ne saute pas les chaînes vides. Cependant, il saute tout Valeurs null après l'argument de séparateur. P> blockquote>
Donc, dans votre cas, il devrait être: p>
xxx pré> p>
Corrigez-moi si je me trompe mais concat_ws () code> est disponible dans MySQL et non oracle rdbms.
C'est ainsi que j'ai généralement concaténé plusieurs champs et éliminez WhitSpace dans Oracle: P>
garniture (Regexp_replace (house_no || '' || préfixe || '' || Nom de rue || '' || '|| Street_type ||' '|| suffixe,' + '' || ')) Code> p>
J'ai utilisé Regexp_replace de ce problème mais j'ai fait comme Regex_replace (
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
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;