2009-10-24 7 views
67

Je essentiellement veux afficher cette (ligne entière dans la première colonne):Oracle SQL, concaténer plusieurs colonnes + ajouter du texte

J'aime le gâteau [colonne de type] avec [colonne glace] et [colonne de fruits].

Le résultat devrait être:

Cake_Column 
---------------- 

I like chocolate cake with whipped_cream and a cherry. 

I like strawberry cake with vanilla_cream and a lemon_slice. 

etc. 

etc. 

je besoin d'une sorte de déclaration TO_CHAR qui fait ([colonne] "texte" [colonne]) "new_column_name";

Que suis-je supposé savoir?

Répondre

20
select 'i like' || type_column || ' with' ect.... 
+0

Merci beaucoup pour cette réponse. J'aime le '||' car il est plus facile de gérer la requête SQL. –

101

Vous avez deux options pour les chaînes concaténer dans Oracle:

CONCAT exemple:

CONCAT(
    CONCAT(
    CONCAT(
     CONCAT(
     CONCAT('I like ', t.type_desc_column), 
     ' cake with '), 
     t.icing_desc_column), 
    ' and a '), 
    t.fruit_desc_column) 

En utilisant || exemple:

'I like ' || t.type_desc_column || ' cake with ' || t.icing_desc_column || ' and a ' || t.fruit_desc_column 
+5

Cette concat m'a donné un cancer lulz, upvote! –

+0

Ceci est vraiment lent (à exécuter, pas vraiment à taper). Y a-t-il une meilleure façon? –

+0

C'est tellement moche, par rapport à un SGBD de très ancienne marque. Comment se fait-il que Oracle ne prenne pas pour exemple Concat? Cependant, grâce à Shankar, il y a un || opérateur. –

23

Ci-dessous requête fonctionne pour moi @Oracle 10G ----

select PHONE, CONTACT, (ADDR1 || '-' || ADDR2 || '-' || ADDR3) as Address 
from CUSTOMER_DETAILS 
where Code='341'; 

O/P -

1111 abc @ gmail .com 4th street-capetown-sa

8

Essayez ceci:

SELECT 'I like ' || type_column_name || ' cake with ' || 
icing_column_name || ' and a ' fruit_column_name || '.' 
AS Cake_Column FROM your_table_name; 

Il faut concaténer toutes les données en entrée de colonne unique nommé « Cake_Column ».

0

À partir d'Oracle 11, il existe une nouvelle fonctionnalité appelée LISTAGG qui fait la même chose que ce que vous voulez ici.

Exemple:

SELECT LISTAGG(last_name, '; ') 
WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list", 
       MIN(hire_date) "Earliest" 
    FROM employees WHERE department_id = 30; 

Emp_list              Earliest 
------------------------------------------------------------ --------- 
Raphaely;Khoo; Tobias; Baida; Himuro; Colmenares    07-DEC-02 

Oracle documentation for LISTAGG

Questions connexes