我試圖弄清楚如何從 SQL Server 中的列中提取子字串。如果可能的話,我非常希望能夠直接在 SQL 中完成。我的專欄內容包含 Web 表單的回應,如下所示:
"a:27:{s:5:\"FieldX\";s:22:\"Response to FieldX\";s:16:\"WhatProductDoYouWant\";s:31:\"SomeProduct\";s:16:\"FieldY\";s:4:\"Response to FieldY\"}
在前面的示例中,表單具有三個欄位,它們各自的回應如下:
FieldName Response
FieldX Response to FieldX
WhatProductDoYouWant SomeProduct
FieldY Response to FieldY
我需要提取 的答案WhatProductDoYouWant,即我需要SomeProduct。
約束:
- 我不知道我要找的欄位之前或之后有多少個欄位,它是一個動態表單。
- 該欄位的答案是動態的,這意味著我不知道我需要考慮多少個字符,它可以是任何東西。
舉一個完整的例子,假設我在 SQL Server 表中有下表:
CREATE TABLE WebFormData
(
FormID int,
Responses varchar(MAX)
);
INSERT INTO WebFormData (FormID, Responses)
VALUES (1, 'a:27:{s:5:\"FieldX\";s:22:\"Response to FieldX\";s:16:\"WhatProductDoYouWant\";s:31:\"SomeProduct\";s:16:\"FieldY\";s:4:\"Response to FieldY\"}');
INSERT INTO WebFormData (FormID, Responses)
VALUES (2, 'a:27:{s:5:\"FieldX\";s:22:\"Response to FieldX\";a:27:{s:7:\"FieldX2\";s:27:\"Response to FieldX2\";s:16:\"WhatProductDoYouWant\";s:31:\"SomeOtherProduct\";s:16:\"FieldZ\";s:4:\"Response to FieldZ\";s:16:\"FieldY\";s:4:\"Response to FieldY\"}');
我想要一個 SQL 查詢,例如:
SELECT FormID, someExpression AS Products
FROM WebFormData
我希望有這樣的結果:
1, SomeProduct
2, SomeOtherProduct
我已經能夠識別我正在尋找的初始字符的索引,但我不知道如何確定子字串的長度:
SELECT
FormID,
SUBSTRING(Responses, CHARINDEX('WhatProductDoYouWant', Responses) 30, 20) AS Products
FROM
WebFormData
(substring函式的length引數中的20只是一個亂數,用于演示)
查詢回傳:
FormID,Products
1, SomeProduct\";s:16:\
2, SomeOtherProduct\";s
任何幫助,將不勝感激。如果需要澄清,請告訴我。
uj5u.com熱心網友回復:
您可以簡單地使用values子句鏈接cross apply來查找您的開始和長度位置,并使用nullif來處理文本不存在的位置:
select Substring(Responses, NullIf(p1,0) 30, p2-(NullIf(p1,0) 30)) Products
from WebFormData
cross apply (values(CHARINDEX('WhatProductDoYouWant', Responses)))x(p1)
cross apply (values(CHARINDEX('\"', Responses, p1 30 )))y(p2);
uj5u.com熱心網友回復:
也許比你正在尋找的更多。
如果要決議整個字串
例子
;with cte as (
select FormID
,B.RetSeq
,RetVal = replace(B.RetVal,'\"','')
,grp = sum(retSeq % 2) over (partition by FormID order by RetSEQ)
,col = retSeq % 2
From WebFormData A
Cross Apply [dbo].[tvf-Str-Extract-JSON](replace(Responses,'}',';'),':',';') B
)
Select FormID
,Seq = Grp
,Question = max(case when col=1 then RetVal end)
,Response = max(case when col=0 then RetVal end)
From cte
Group By FormID,Grp
Order By FormID,Grp
結果

感興趣的幫助函式
CREATE FUNCTION [dbo].[tvf-Str-Extract-JSON] (@String nvarchar(max),@Delim1 nvarchar(100),@Delim2 nvarchar(100))
Returns Table
As
Return (
Select RetSeq = row_number() over (order by RetSeq)
,RetVal = left(RetVal,charindex(@Delim2,RetVal)-1)
From (
Select RetSeq = [Key] 1
,RetVal = Value
From OpenJSON( N'["' replace(string_escape(@String,'json'),@Delim1,'","') N'"]' )
) C1
Where charindex(@Delim2,RetVal)>1
)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528467.html
上一篇:運行程式時資料庫背景關系為空
