Слияние двух строк в Oracle SQL - PullRequest
2 голосов
/ 02 октября 2010

Есть ли способ объединить две строки, возвращенные в запросе, как это: у меня есть одна строка '<6 spaces>XYZ' и другие строки '<3 spaces>ABC<3 spaces>'. В основном каждая строка делится на 3 части, и две любые части будут пустыми. Я хочу объединить эти две строки для вывода: '<3 spaces> ABCXYZ'.

Другим примером может быть 'ABC<6 spaces>', а строка '<6 spaces>DEF' должна выдать 'ABC<3 spaces>DEF>'

Ответы [ 2 ]

7 голосов
/ 02 октября 2010

Вы можете воспользоваться тем, что пробелы располагаются в алфавитном порядке раньше, чем буквы и цифры:

with q as (select '   ABC   ' as c1,'      DEF' as c2 from dual
 union all select 'ABC      ', '      DEF' from dual
 union all select '   DEF   ', 'ABC      ' from dual
 union all select '      DEF', '   ABC   ' from dual
 union all select 'ABC      ', '   DEF   ' from dual
 union all select '      DEF', 'ABC      ' from dual
)
select c1, c2,
       GREATEST(SUBSTR(c1, 1, 3), SUBSTR(c2, 1, 3)) ||
       GREATEST(SUBSTR(c1, 4, 3), SUBSTR(c2, 4, 3)) ||
       GREATEST(SUBSTR(c1, 7, 3), SUBSTR(c2, 7, 3)) mrg
from q;


C1        C2        MRG       
--------- --------- --------- 
   ABC          DEF    ABCDEF 
ABC             DEF ABC   DEF 
   DEF    ABC       ABCDEF    
      DEF    ABC       ABCDEF 
ABC          DEF    ABCDEF    
      DEF ABC       ABC   DEF 

6 rows selected
4 голосов
/ 02 октября 2010

Oracle 10g +:

SELECT t.column1,
       t.column2,
       CASE
         WHEN REGEXP_LIKE(t.column1, '^\w{3}') AND REGEXP_LIKE(t.column2, '\w{3}$') THEN 
           TRIM(t.column1) || '   ' || TRIM(t.column2)            
         WHEN REGEXP_LIKE(t.column1, '^\w{3}') AND REGEXP_LIKE(t.column2, '\s{3}\w{3}') THEN 
           TRIM(t.column1) || TRIM(LEADING FROM t.column2) 
         WHEN REGEXP_LIKE(t.column1, '\s{3}\w{3}') AND REGEXP_LIKE(t.column2, '\w{3}$') THEN 
           TRIM(TRAILING FROM t.column1) || TRIM(t.column2) 
         WHEN REGEXP_LIKE(t.column2, '^\w{3}') AND REGEXP_LIKE(t.column1, '\w{3}$') THEN 
           TRIM(t.column2) || '   ' || TRIM(t.column1)            
         WHEN REGEXP_LIKE(t.column2, '^\w{3}') AND REGEXP_LIKE(t.column1, '\s{3}\w{3}') THEN 
           TRIM(t.column2) || TRIM(LEADING FROM t.column1) 
         WHEN REGEXP_LIKE(t.column2, '\s{3}\w{3}') AND REGEXP_LIKE(t.column1, '\w{3}$') THEN 
           TRIM(TRAILING FROM t.column2) || TRIM(t.column1)   
       END AS col
  FROM table1 t 

Поддерживающие скрипты:

CREATE TABLE "EXAMPLE"."TABLE1" (
  "COLUMN1" VARCHAR2(9 BYTE), 
  "COLUMN2" VARCHAR2(9 BYTE)
);

Insert into TABLE1 (COLUMN1,COLUMN2) values ('   ABC   ','      DEF');
Insert into TABLE1 (COLUMN1,COLUMN2) values ('ABC      ','      DEF');
Insert into TABLE1 (COLUMN1,COLUMN2) values ('   DEF   ','ABC      ');
Insert into TABLE1 (COLUMN1,COLUMN2) values ('      DEF','   ABC   ');
Insert into TABLE1 (COLUMN1,COLUMN2) values ('ABC      ','   DEF   ');
Insert into TABLE1 (COLUMN1,COLUMN2) values ('      DEF','ABC      ');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...