Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL server中基于字符提取部分字符串?_Sql_Sql Server_Substring_Charindex - Fatal编程技术网

如何在SQL server中基于字符提取部分字符串?

如何在SQL server中基于字符提取部分字符串?,sql,sql-server,substring,charindex,Sql,Sql Server,Substring,Charindex,我在SQL Server中有一个字符串字段,其中包含一些我想拆分为单独字段的项。其中两个包含双引号。这是一个关于该领域存在的问题的例子。这一切都在一个字符串中 示例:111668999 555444888 3低5高 我想做的是将3低和5高划分到它们自己的新字段中,但保留它们周围的引号。我已经成功地将这些数值分离出来,所以我正在处理3个低5个高的数值。我相信这可以通过CHARINDEX和SUBSTRING的组合来完成,但我一直在努力将引号识别为起点和终点,并确保它们仍然包含在新字段中 谢谢 您可以

我在SQL Server中有一个字符串字段,其中包含一些我想拆分为单独字段的项。其中两个包含双引号。这是一个关于该领域存在的问题的例子。这一切都在一个字符串中

示例:111668999 555444888 3低5高

我想做的是将3低和5高划分到它们自己的新字段中,但保留它们周围的引号。我已经成功地将这些数值分离出来,所以我正在处理3个低5个高的数值。我相信这可以通过CHARINDEX和SUBSTRING的组合来完成,但我一直在努力将引号识别为起点和终点,并确保它们仍然包含在新字段中


谢谢

您可以创建此函数

CREATE FUNCTION [dbo].[SplitString]
(
@sString nvarchar(2048),
@cDelimiter nchar(3),
@mark nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
        @iPos int
if substring( @sString, 1, 1 ) = @cDelimiter 
begin
    set @iStart = 2
    insert into @tParts
    values( null )
end
else 
    set @iStart = 1
while 1=1
begin
    set @iPos = charindex( @cDelimiter, @sString, @iStart )
    if @iPos = 0
        set @iPos = len( @sString )+1
    if @iPos - @iStart > 0          
        insert into @tParts
        values  ( replace(ltrim(substring( @sString, @iStart, @iPos-        
    @iStart )) + @mark,'""','"'))       
    set @iStart = @iPos+1
    if @iStart > len( @sString ) 
        break
  end
  RETURN

END

GO
这样使用它

SELECT * FROM [dbo].[SplitString] 
('"3 LOW" "5 HIGH" "7 HIGH" "8 HIGH"','" "', '"')
结果

"3 LOW"
"5 HIGH"
"7 HIGH"
"8 HIGH"

您可以创建此函数

CREATE FUNCTION [dbo].[SplitString]
(
@sString nvarchar(2048),
@cDelimiter nchar(3),
@mark nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
        @iPos int
if substring( @sString, 1, 1 ) = @cDelimiter 
begin
    set @iStart = 2
    insert into @tParts
    values( null )
end
else 
    set @iStart = 1
while 1=1
begin
    set @iPos = charindex( @cDelimiter, @sString, @iStart )
    if @iPos = 0
        set @iPos = len( @sString )+1
    if @iPos - @iStart > 0          
        insert into @tParts
        values  ( replace(ltrim(substring( @sString, @iStart, @iPos-        
    @iStart )) + @mark,'""','"'))       
    set @iStart = @iPos+1
    if @iStart > len( @sString ) 
        break
  end
  RETURN

END

GO
这样使用它

SELECT * FROM [dbo].[SplitString] 
('"3 LOW" "5 HIGH" "7 HIGH" "8 HIGH"','" "', '"')
结果

"3 LOW"
"5 HIGH"
"7 HIGH"
"8 HIGH"

这将把值放在字段而不是行中

范例

返回


这将把值放在字段而不是行中

范例

返回