在SQL中的双引号之间提取字符串

Noe*_*lle 1 sql t-sql sql-server

我有一个字符串,我需要在双引号之间返回字符

'(("名称​​1"和"名称2")或"名称3")

我需要回来

Name 1
Name 2
Name 3
Run Code Online (Sandbox Code Playgroud)

我已经使用下面的函数来分割字符串,但我得到((和Or和AND等...我不想要的,不幸的是我不能确定所有其他可以包含的字符,所以删除他们或替换他们是不可行的.

ALTER FUNCTION [dbo].[fn_SplitString] 
( 
   @string NVARCHAR(MAX), 
   @delimiter CHAR(1) 
) 
RETURNS @output TABLE(ID int, splitdata NVARCHAR(MAX) 
) 
BEGIN 
   DECLARE @start INT, @end INT, @Count INT
   set @Count = 1
   SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
   WHILE @start < LEN(@string) + 1 BEGIN 
      IF @end = 0  
         SET @end = LEN(@string) + 1

       INSERT INTO @output (ID, splitdata)  
       VALUES(@Count, SUBSTRING(@string, @start, @end - @start)) 
       SET @start = @end + 1 
       SET @end = CHARINDEX(@delimiter, @string, @start)
       Set @Count = @Count+1
   END 
   RETURN 
END
Run Code Online (Sandbox Code Playgroud)

我知道这段代码会在两个分隔符之间返回字符串

substring( LEFT(@String, charindex(']', @String)-1), CHARINDEX('[', @String) + len('['), LEN(@String)) 
Run Code Online (Sandbox Code Playgroud)

有没有办法结合2并返回所需的输出?

谢谢

Shn*_*ugo 5

这是一种递归方法

DECLARE @s VARCHAR(100)='(("Name 1" and "Name 2") or "Name 3")';

WITH recCTE AS
(
    SELECT 1 AS Position
          ,SUBSTRING(@s,1,1) AS CharAtPos
          ,CASE WHEN SUBSTRING(@s,1,1)='"' THEN 0 ELSE -1 END AS QuoteGroup
          ,CASE WHEN SUBSTRING(@s,1,1)='"' THEN 1 ELSE 0 END AS QuoteIsOpen
    UNION ALL
    SELECT r.Position+1
          ,SUBSTRING(@s,r.Position+1,1)
          ,CASE WHEN SUBSTRING(@s,r.Position+1,1)='"' THEN CASE WHEN r.QuoteIsOpen=0 THEN r.QuoteGroup+1 ELSE r.QuoteGroup END ELSE r.QuoteGroup END AS QuoteGroup
          ,CASE WHEN SUBSTRING(@s,r.Position+1,1)='"' THEN CASE WHEN r.QuoteIsOpen=0 THEN 1 ELSE 0 END ELSE r.QuoteIsOpen END AS QuoteIsOpen
    FROM recCTE r
    WHERE r.Position+1<=LEN(REPLACE(@s,' ','*')) 
)
SELECT r.QuoteGroup
      ,(
        SELECT CharAtPos AS [*]
        FROM recCTE r2 
        WHERE r2.QuoteGroup=r.QuoteGroup AND r2.QuoteIsOpen=1 AND r2.CharAtPos<>'"'
        ORDER BY r2.Position
        FOR XML PATH(''),TYPE).value('.','varchar(100)')
FROM recCTE r
WHERE r.QuoteGroup>=0
GROUP BY QuoteGroup;
Run Code Online (Sandbox Code Playgroud)

一些解释:

递归CTE将逐个字符地运行字符串.它将检查报价并跟踪开盘关闭.根据这一点,具有打开标志的所有值都被分组并通过XML重新连接.