2015-10-19 2 views
1

У меня есть записи идет, как показано ниже:Повернитесь несколько записей

Item | Color Code 
Bag | 1,2,3 

Как я могу превратить эти записи в:

Item | Color Code 
Bag | 1 
Bag | 2 
Bag | 3 

на уровне SQL без какого-либо вмешательства новой программы.

У меня есть проблема, чтобы построить пакет и куб без этого формата данных

+0

Является ли цвет код всегда 1,2,3? Сколько цветовых кодов есть? Всегда ли они разделены запятой? – Utsav

+0

Никогда не сохраняйте данные как значения, разделенные запятой, это вызовет у вас массу проблем. Одна строка на элемент - это путь SQL! – jarlh

+0

hi utsav и jarlh .. это исходные данные от поставщика db .. я не могу ничего найти, кроме поиска решения. T_T ценят за быстрый ответ, и это решает мое узкое место для сборки куба. там около 100 + кодов .... я просто буду использовать технологию куба при привязке описания цвета с целью уменьшить нагрузку на источник db вместо использования соединений –

ответ

0

Это будет работать

with t1(Item,ColorCode) as 
    (select 'Bag', '1,2,3' from dual) 
select Item,regexp_substr(ColorCode, '[^,]+', 1, level) result 
from t1 
connect by level <= length(regexp_replace(ColorCode, '[^,]+')) + 1; 
+0

спасибо u! он работает. Я применил sql в cognos (SQL type = Pass through), и это работает. Но может я знаю, добавит ли это дополнительную нагрузку на производительность db? или как я должен измерить воздействие? –

+0

Если данные хранятся в значениях, разделенных запятыми, вам необходимо использовать регулярное выражение для его извлечения. Так что это так же быстро, как вы можете получить его. Чтобы просмотреть производительность, вы можете увидеть «план объяснения», но вы не можете уменьшить ее вниз. Кроме того, если ответ сработал для вас, пожалуйста, [принимайте] (http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow), нажав на значок галочки на слева от ответа, чтобы он мог быть закрыт. – Utsav

0

Попробуйте это:

SELECT t.Item, 
     trim(regexp_substr(t.ColorCode, '[^,]+', 1, lines.column_value)) ColorCode 
    FROM t, 
    TABLE (CAST (MULTISET 
    (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.ColorCode, ',')+1) 
       AS sys.odciNumberList 
       ) 
     ) lines 

SQL FIDDLE DEMO

+1

поблагодарить u за решение! –

+0

@ChooiLingSiToh: - Добро пожаловать! –

Смежные вопросы