【问题标题】:How to eliminate Nulls, and insert with split delimter如何消除空值,并使用拆分分隔符插入
【发布时间】:2014-06-22 04:12:22
【问题描述】:
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 的代码

创建 FUNCTION [dbo].[SplitDelimiterString] (@StringWithDelimiter VARCHAR(8000), @Delimiter VARCHAR(8)) 返回 @ItemTable 表(项目 VARCHAR(8000)) 作为 开始 声明@StartingPosition INT; 声明 @ItemInString VARCHAR(8000); 选择@StartingPosition = 1; --如果字符串为空或空则返回 如果 LEN(@StringWithDelimiter) = 0 或 @StringWithDelimiter 为 NULL 返回; 而@StartingPosition > 0 开始 --获取分隔符的起始索引..如果是字符串 -- 不包含任何分隔符,它将返回 0 SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); --从字符串中获取项目 如果@StartingPosition > 0 SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition) 别的 SET @ItemInString = @StringWithDelimiter; --如果项目不为空,则添加到返回表 如果(LEN(@ItemInString)> 0) 插入@ItemTable(Item) 值 (@ItemInString); --从字符串中删除插入的项目 SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition) --如果字符串为空则中断循环 IF LEN(@StringWithDelimiter) = 0 中断; 结尾 返回 结尾

--结果集是

Col1 Col2 Col3 Col4 123 空 空 空 第456章 空 abc 空 空 空定义空空 NULL NULL fff NULL NULL NULL ggg NULL 空 空 空 520002 空 空 空 520003

-- 我需要一个类似的结果集
-- 结果集是

col1 col2 col3 col4 123 abc fff 520002 第456章 520003

请帮忙。

【问题讨论】:

  • 问题没有很好的定义。该要求中不同列的关联是什么?
  • 您需要定义它们之间的关系。它只是在分隔字符串中的位置吗?如果是这样,您还可以从函数中返回行号,然后将它们连接在一起以构成 1 个插入语句。
  • @liebs19 非常感谢......我明白了。
  • @user3605493,很高兴我能够为您指明正确的方向。您应该将您的解决方案作为答案发布并接受它,而不是仅仅将其编辑到帖子中。您可以在本网站上回答您自己的问题。
  • @liebs19 我该怎么做?我是这个网站的新手。

标签: tsql split null


【解决方案1】:

--- 想通了我的自我。感谢@liebs19 的逻辑

开始传输 创建表 #Temp1 ( RowID int not null identity(1,1) 主键, col1 Varchar(20), ) 创建表 #Temp2 ( RowID int not null identity(1,1) 主键, col2 Varchar(20), ) 创建表 #Temp3 ( RowID int not null identity(1,1) 主键, col3 Varchar(20), ) 创建表 #Temp4 ( RowID int not null identity(1,1) 主键, col4 Varchar(20), ) 插入#Temp1(col1) Select * From SplitDelimiterString('123,456', ',') 插入#Temp2(col2) Select * From SplitDelimiterString('abc,def', ',') 插入#Temp3(Col3) Select * From SplitDelimiterString('fff,ggg', ',') 插入#Temp4(col4) Select * From SplitDelimiterString('520002,520003', ',') 选择#Temp1.Col1、#Temp2.​​col2、#Temp3.Col3、#Temp4.Col4 来自#Temp1 内部连接 ​​#Temp2 ON #Temp1.RowID = #Temp2.​​RowID 内部连接 ​​#Temp3 ON #Temp1.RowID = #Temp3.RowID 内部连接 ​​#Temp4 ON #Temp1.RowID = #Temp4.RowID 回滚传输

-- 这是我最终要找的输出。

col1 col2 col3 col4 123 abc fff 520002 第456章 520003

.

【讨论】:

    猜你喜欢
    • 2022-12-26
    • 2019-09-26
    • 2021-08-15
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多