2009-10-24 16 views
67

Więc w zasadzie chcesz wyświetlić ten cały rząd (w jednej kolumnie):Oracle SQL, złączyć wiele kolumn + dodaj tekst

Lubię [typ kolumny] ciasto z [kolumnie pudrem] oraz [kolumnę owoców].

Wynik powinien być:

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. 

muszę jakieś oświadczenie to_char że robi ([kolumny] "jakiś tekst" [kolumny]) "new_column_name";

Co powinienem wiedzieć?

Odpowiedz

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

Dziękuję bardzo za tę odpowiedź. Podoba mi się "||" ponieważ ułatwia utrzymanie zapytania SQL. –

101

Masz dwie opcje łączenie ciągów w Oracle:

przykład CONCAT:

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

Korzystanie || przykład:

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

Ten concat dał mi raka lulz, upvote! –

+0

To jest naprawdę powolne (uruchomić, a nie pisać). Czy istnieje lepszy sposób? –

+0

To jest tak brzydkie, jeśli chodzi o bardzo starą markę DBMS. Jak to możliwe, że Oracle nie wspiera konkluzji w wielu argumentach? Jednak dzięki Shankarowi jest || operator. –

23

poniższe zapytanie działa na mnie @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

Spróbuj tego:

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

Należy łączyć wszystkie te dane jako pojedynczy wpis kolumnie o nazwie „Cake_Column”.

0

Od Oracle 11, jest nowa funkcja o nazwie LISTAGG, która robi coś podobnego do tego, co chcesz tutaj.

Przykład:

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