回答

收藏

SQL解析定界字符串

技术问答 技术问答 208 人阅读 | 0 人回复 | 2023-09-12

我找不到执行此操作的好方法,由于某些限制,我必须在不使用变量的情况下编码它,但我可以调用函数。无论如何,我需要从Select查询返回结果集,其中一行为管道分隔字符串。# g' g" y$ v- L5 h: m" n$ G- a4 m
因此,它将返回类似于以下内容的内容:( R8 s* c4 T/ z: C& S) y0 ^
id| Name      | Message |---------------------1 | Some Name | 'Here is my | delimited | message'我需要它成为1 V8 @7 S  a5 v: ~  Q' y- ]
id| Name      | Message1     | Message2    | Message3------------------------------------------------------1 | Some Name | 'Here is my' | 'delimited' | 'message'我在想类似的事情Parsename('','|你可以输入定界符而不是总是输入句点,但我不知道实现这一目标的最佳方法。
6 R3 O' y3 q3 I/ T编辑:我试过这个变化,但当然很迷茫。可能有四个或更多。|% h4 T5 G' G/ R' U! H" p3 E. a
SELECT Field1,Field2 AS Originalvalue,--1SUBSTRING(Field2,0,CHARINDEX('|',Field2)) AS Msg1,--2LEFT(SUBSTRING(Field2,CHARINDEX('|',Field2) 1 ,LEN(Field2)),CHARINDEX('|',SUBSTRING(Field2,CHARINDEX('|',Field2) 1 ,LEN(Field2)))-1)AS ExtractedValueFROM Table1 T1 JOIN Table2 T2ON T1.Id = T2.IdWHERE T1.Id = 122                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
& F- i6 F! U1 o- z    解决方案:                                                                ; h$ H% q9 d- y5 q. I/ M: m" M4 j  i
                                                                你可以写一个sql函数,如下所示。4 P' A# h3 i8 T, |
create Function dbo.fn_Parsename(@Message Varchar(1000),@delimiter char(1),@index int )Returns Varchar(1000)AsBegin    Declare        @curIndex int = 0,   @pos int = 1、         @prevPos int = 0,   @result varchar(1000)    while @pos > 0    Begin        set @pos =  CHARINDEX(@delimiter,@Message,@prevPos);        if(@pos > 0)        begin-- get the chars between the prev position to next delimiter pos            set @result = SUBSTRING(@message,@prevPos,@pos-@prevPos)        end        else        begin--get last delim message            set @result = SUBSTRING(@message,@prevPos,LEN(@message))        end        if(@index = @curIndex)        begin            return @result        end        set @prevPos = @pos                                set @curIndex = @curIndex   1;   end    return ''--not foundEnd按以下方法调用:
% \" F- _8 a+ X$ g1 Dselect dbo.fn_Parsename('Here is my | delimited | message','|',0)select dbo.fn_Parsename('Here is my | delimited | message','|',1)select dbo.fn_Parsename('Here is my | delimited | message','|2)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则