Как да премахнете Nulls и да вмъкнете с разделителен разделител

drop table #temp

Create Table #Temp 
( 
col1 Varchar(20), 
col2 Varchar(20), 
Col3 Varchar(50), 
col4 Varchar(20)
)

Select * From #Temp 

Insert Into #Temp(col1)
Select * From SplitDelimiterString('123,456', ',')

Insert Into #Temp(col2)
Select * From SplitDelimiterString('abc,def', ',')

Insert Into #Temp(Col3)
Select * From SplitDelimiterString('fff,ggg', ',')

Insert Into #Temp(col4)
Select * From SplitDelimiterString('520002,520003', ',')

Select * From #Temp

За информация, SplitDelimiterString е функция. -- Код за SplitDelimiterString

Create FUNCTION [dbo].[SplitDelimiterString] (@StringWithDelimiter VARCHAR(8000), @Delimiter VARCHAR(8))

RETURNS @ItemTable TABLE (Item VARCHAR(8000))

AS
BEGIN
    DECLARE @StartingPosition INT;
    DECLARE @ItemInString VARCHAR(8000);

    SELECT @StartingPosition = 1;
    --Return if string is null or empty
    IF LEN(@StringWithDelimiter) = 0 OR @StringWithDelimiter IS NULL RETURN; 

    WHILE @StartingPosition > 0
    BEGIN
        --Get starting index of delimiter .. If string
        --doesn't contain any delimiter than it will returl 0 
        SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); 

        --Get item from string        
        IF @StartingPosition > 0                
            SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition)
        ELSE
            SET @ItemInString = @StringWithDelimiter;
        --If item isn't empty than add to return table    
        IF( LEN(@ItemInString) > 0)
            INSERT INTO @ItemTable(Item) VALUES (@ItemInString);            

        --Remove inserted item from string
        SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + 
                     LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition)

        --Break loop if string is empty
        IF LEN(@StringWithDelimiter) = 0 BREAK;
    END

    RETURN
END

-- Наборът от резултати е


Col1    Col2      Col3    Col4

123     NULL      NULL    NULL
456     NULL      NULL    NULL
NULL    abc       NULL    NULL
NULL    def       NULL    NULL
NULL    NULL      fff     NULL
NULL    NULL      ggg     NULL
NULL    NULL      NULL    520002
NULL    NULL      NULL    520003

-- Имам нужда от набор от резултати като
-- Наборът от резултати е

col1      col2      col3      col4

123       abc       fff       520002
456       def       ggg       520003

Моля помогнете.


person user3605493    schedule 05.05.2014    source източник
comment
Проблемът не е добре дефиниран. Каква е асоциацията на различни колони в това изискване?   -  person Roopesh    schedule 06.05.2014
comment
Трябва да определите как те са свързани. Дали това е просто позиция в разделения низ? Ако е така, можете също да върнете номера на реда от функцията и след това да ги обедините заедно, за да направите 1 израз за вмъкване.   -  person liebs19    schedule 07.05.2014
comment
@liebs19 Благодаря ви много.. Разбрах.   -  person user3605493    schedule 07.05.2014
comment
@user3605493, радвам се, че успях да те насоча в правилната посока. Трябва да публикувате вашето решение като отговор и да го приемете, вместо просто да го редактирате в публикацията. Добре е да отговаряте на собствените си въпроси на този сайт.   -  person liebs19    schedule 08.05.2014
comment
@liebs19 Как мога да направя това? Аз съм нов в този уебсайт.   -  person user3605493    schedule 08.05.2014
comment
@user3605493 Вземете текста, който сте редактирали, в публикацията си и го поставете в текстовото поле Вашият отговор в долната част и след това щракнете върху бутона Публикувайте своя отговор. След като отговорът бъде публикуван, трябва да можете да го маркирате като приет.   -  person liebs19    schedule 08.05.2014


Отговори (1)


--- Разбрах себе си. Благодаря на @liebs19 за логиката


BEGIN TRAN

Create Table #Temp1

( 

RowID int not null identity(1,1) primary key,

col1 Varchar(20), 

)

Create Table #Temp2 

( 

RowID int not null identity(1,1) primary key,

col2 Varchar(20), 

)

Create Table #Temp3 

( 

RowID int not null identity(1,1) primary key,

col3 Varchar(20), 

)

Create Table #Temp4 

( 

RowID int not null identity(1,1) primary key,

col4 Varchar(20), 

)

Insert Into #Temp1(col1)

Select * From SplitDelimiterString('123,456', ',')


Insert Into #Temp2(col2)

Select * From SplitDelimiterString('abc,def', ',')

Insert Into #Temp3(Col3)

Select * From SplitDelimiterString('fff,ggg', ',')

Insert Into #Temp4(col4)

Select * From SplitDelimiterString('520002,520003', ',')


Select  #Temp1.Col1, #Temp2.col2, #Temp3.Col3, #Temp4.Col4 

From #Temp1 

Inner Join #Temp2 ON #Temp1.RowID = #Temp2.RowID

Inner Join #Temp3 ON #Temp1.RowID = #Temp3.RowID

Inner Join #Temp4 ON #Temp1.RowID = #Temp4.RowID 


ROLLBACK TRAN

-- Това е резултатът, който най-накрая търся.

col1      col2      col3      col4

123       abc       fff       520002
456       def       ggg       520003

.

person user3605493    schedule 08.05.2014