2013-11-12 3 views
0

Я построил это решение на основе аналогичного вопроса здесь, но мой пример намного больше, чем приведенный здесь пример. Мое решение работает, но мне интересно, лучший ли он/самый эффективный.Разделение запятой Отдельные значения в столбцах oracle

Одно предостережение: мне нужно это, чтобы иметь возможность запускать как прямой запрос.

Я построил этот SQL, чтобы разбить строку на несколько столбцов. Я оставил свою переменную там, потому что:

  1. это короче, чем реальная строка и
  2. это на самом деле не имеет значения для задавая вопрос.

Во время выполнения эта переменная заменяется на строку с 14 значениями, разделенными 13 запятыми. Мне нужны последние 3 значения, объединенные вместе.

Без дальнейших церемоний, вот мой запрос:

select 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 1) c1, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 2) c2, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 3) c3, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 4) c4, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 5) c5, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 6) c6, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 7) c7, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 8) c8, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 9) c9, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 10) c10, 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 11) c11, 
    replace(regexp_substr('$CSV Text Single Line$','[^,]+',1, 12) 
      ||','|| 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 13) 
      ||','|| 
      regexp_substr('$CSV Text Single Line$','[^,]+',1, 14) 
      ,'"','')            c12 
from dual 

Заранее спасибо за любые советы.

ответ

0

Уродливая часть состоит в том, что строка CSV появляется в запросе более одного раза. Улучшение я вижу, чтобы изолировать эту строку в подзапрос:

with 
    csv as (
    select '$CSV Text Single Line$' str 
     from dual) 
select regexp_substr(str,'[^,]+', 1, 1) c1, 
     regexp_substr(str,'[^,]+', 1, 2) c2, 
     regexp_substr(str,'[^,]+', 1, 6) c6, 
     regexp_substr(str,'[^,]+', 1, 7) c7, 
     regexp_substr(str,'[^,]+', 1, 8) c8, 
     regexp_substr(str,'[^,]+', 1, 9) c9, 
     regexp_substr(str,'[^,]+', 1, 10) c10, 
     regexp_substr(str,'[^,]+', 1, 11) c11, 
     replace(regexp_substr(str,'[^,]+', 1, 12) ||','|| 
      regexp_substr(str,'[^,]+', 1, 13) ||','|| 
      regexp_substr(str,'[^,]+', 1, 14) ,'"','') c12 
from csv; 

В случае длинной строки CSV вы можете сэкономить ценное пространство в вашей области разделяемого пула, особенно если выполнить этот запрос довольно часто с использованием различных Аппаратно закодированные строки CSV. Если используются связки, преимущество состоит в том, что достаточно привязать одну переменную вместо 11.

0

Регулярные выражения могут быть дорогими. Для вашего последнего столбца вместо использования 3 функций регулярных выражений, а затем их объединения, вы можете использовать простой SUBSTR.

select replace(
       substr('$CSV Text Single Line$', 
         instr('$CSV Text Single Line$',',',-1,3) + 1 
        ), 
       '"','' 
      ) as c12 
from dual; 
Смежные вопросы