2012-05-15 3 views
-1

У меня возникла проблема с записью запроса на разделение данных из одного столбца на несколько столбцов.Необходимо разделить данные из одного столбца на несколько столбцов

Пример:

Col1 
--------------------------- 
bank.wrong.transaction 
bank.wrong.transaction.captured 
business.unit.explored.wrong.way 
application.failed 

необходимо поместить данные в столбцы, как это:

col1  col2   col3 
-------------------------------------------------  
wrong  transaction null 
wrong  transaction captured 
unit  explored  wrong 
failed null   null 

Я не знаю, длина любой строки на всех.

Пожалуйста, помогите мне с этим.

Благодаря Саа .. можно было бы использовать

+0

возможно дубликат [Удалить и разделить данные в несколько столбцов в операторе отбора] (http://stackoverflow.com/questions/1735791/remove-and-split-data-into- multiple-columns-in-select-statement) –

+0

Почему вы выбрасываете часть данных 'a.'? У всех * данных есть ведущий 'a.'? Если вы не можете показать некоторые другие примеры и как вы хотите, чтобы результат выглядел? –

+2

, конечно, лучше всего редизайн и избавиться от этого, вы не должны сочтены данные таким образом. – HLGEM

ответ

1

что-то вроде следующего, чтобы получить требуемый результат (косяк вспомнить, где я ограбил функцию ParseString из - но я использую его все время, отлично работает)

CREATE FUNCTION dbo.fnParseString 
    (
     @Section SMALLINT , 
     @Delimiter CHAR , 
     @Text VARCHAR(MAX) 
    ) 
RETURNS VARCHAR(8000) 
AS 
    BEGIN 
     DECLARE @NextPos SMALLINT , 
      @LastPos SMALLINT , 
      @Found SMALLINT 

     --#### Uncomment the following 2 lines to emulate PARSENAME functionality 
     --IF @Section > 0 
     -- SELECT @Text = REVERSE(@Text) 

     SELECT @NextPos = CHARINDEX(@Delimiter, @Text, 1) , 
       @LastPos = 0 , 
       @Found = 1 

     WHILE @NextPos > 0 
      AND ABS(@Section) <> @Found 
      SELECT @LastPos = @NextPos , 
        @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1) , 
        @Found = @Found + 1 

     RETURN CASE 
      WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL 
      --#### Uncomment the following lines to emulate PARSENAME functionality 
      --WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)) 
      WHEN @Section > 0 THEN SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END) 

      ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END) 
     END 
    END 



DECLARE @TestData VARCHAR(255) 
SET @TestData = 'business.unit.explored.wrong.way' 

SELECT dbo.fnParseString(2, '.', @TestData) , 
     dbo.fnParseString(3, '.', @TestData) , 
     dbo.fnParseString(4, '.', @TestData) , 
     dbo.fnParseString(5, '.', @TestData) , 
     dbo.fnParseString(6, '.', @TestData) 
+0

Спасибо большое @HeavenCore .. – Shahsra

+0

Удивительный код..Действительно оцените его человек .. – Shahsra

0

Ну, вы не ответили на какие-либо вопросы, но я покажу, как вы можете вытащить данные таким образом без накладных расходов на подробные функции, если некоторые из моих предположений верны (например, вы заботитесь только о средних трех значениях):

DECLARE @x TABLE(col1 VARCHAR(255)); 

INSERT @x 
SELECT 'bank.wrong.transaction' 
UNION ALL SELECT 'bank.wrong.transaction.captured' 
UNION ALL SELECT 'business.unit.explored.wrong.way' 
UNION ALL SELECT 'application.failed'; 

WITH x(col1, d) AS 
( 
    SELECT col1, SUBSTRING(col1, CHARINDEX('.', col1) + 1, 255) + 
    CASE WHEN LEN(col1) - LEN(REPLACE(col1, '.', '')) BETWEEN 1 AND 3 THEN 
    REPLICATE('./', 4-(LEN(col1)-LEN(REPLACE(col1, '.', '')))) ELSE '' END 
    FROM @x 
) 
SELECT orig = col1, 
    col1 = NULLIF(PARSENAME(d, 4), '/'), 
    col2 = NULLIF(PARSENAME(d, 3), '/'), 
    col3 = NULLIF(PARSENAME(d, 2), '/') 
FROM x; 

Результаты:

orig        col1  col2   col3 
-------------------------------- ---------- ----------- -------- 
bank.wrong.transaction   wrong  transaction NULL 
bank.wrong.transaction.captured wrong  transaction captured 
business.unit.explored.wrong.way unit  explored  wrong 
application.failed    failed  NULL   NULL 
Смежные вопросы