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并返回所需的输出?
谢谢
这是一种递归方法
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重新连接.
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |