我正在尝试从Gravity Form list control中提取数据。
基本上,列表控件允许您在Web表单上收集多列表数据(在WordPress网站上构建)。但是,用户提供的表和记录都会被放入单行文本中,以便提交表单的记录。
我设法编写了一个自定义标量函数来获取原始输入文本,如下所示:
a:3:{i:0;a:3:{s:6:"ItemID";s:1:"1";s:4:"Name";s:10:"Dennis Dish";s:12:"Phone Number";s:12:"01225 123456";}i:1;a:3:{s:6:"ItemID";s:1:"2";s:4:"Name";s:13:"Sally Spatula";s:12:"Phone Number";s:12:"01225 654321";}i:2;a:3:{s:6:"ItemID";s:1:"3";s:4:"Name";s:10:"Terry Tins";s:12:"Phone Number";s:12:"01225 789456";}}
...并像这样返回它(仍然是单个文本字符串):
ItemID: 1
Name: Dennis Dish
Phone Number: 01225 123456
ItemID: 2
Name: Sally Spatula
Phone Number: 01225 654321
ItemID: 3
Name: Terry Tins
Phone Number: 01225 789456
这是相当直接且有用的,但我现在需要写一些可以将原始字符串返回到一组记录的内容。
因此,例如,如果我有一个包含以下数据的表:
| ID | RawString |
|--------|-------------------------------|
| 1 | a:3:{i:0;a:3:{s:6:"ItemID"... |
..而不是将其作为更整洁的字符串返回,如下所示:
| ID | TidyString |
|--------|-------------------------------|
| 1 | ItemID: 1 Name: Dennis Dish...|
..我正在寻找返回以下内容的方法:
| ID | ItemID | Name | Phone Number |
|--------|--------|---------------|--------------|
| 1 | 1 | Dennis Dish | 01225 123456 |
| 1 | 2 | Sally Spatula | 01225 654321 |
| 1 | 3 | Terry Tins | 01225 789456 |
在我的标量函数中,我能够识别原始字符串格式的一部分,这有助于整理它:
a:n:{...
(从一开始)表示有多少条记录,因此a:3:{...
表示
有3条记录。i:n;...
表示记录编号,因此i:0;...
表示第一个记录编号
记录。 a:n:{...
(在记录中)表示的数量
记录中的列/值对,因此a:3:{
表示有3对
此记录中的列/值。s:...
表示后续列或值中的字符数,因此s:2...
表示列或值的长度为2个字符。通过缩进原始字符串可能更容易将其可视化:
a:3:{
i:0;
a:3:{
s:2:"ItemID";
s:1:"1";
s:4:"Name";
s:10:"Dennis Dish";
s:12:"Phone Number";
s:12:"01225 123456";
}
i:1;
a:3:{
s:2:"ItemID";
s:1:"2";
s:4:"Name";
s:13:"Sally Spatula";
s:12:"Phone Number";
s:12:"01225 654321";
}
i:2;
a:3:{
s:2:"ItemID";
s:1:"3";
s:4:"Name";
s:10:"Terry Tins";
s:12:"Phone Number";
s:12:"01225 789456";
}
}
我不确定从这个原始字符串中将数据作为结果集返回的方式开始。
任何指针都会受到赞赏。
答案 0 :(得分:1)
这是NGrams8K的工作。如果您下载该功能的副本,您可以这样做:
DECLARE @yourstring varchar(1000) =
'a:3:{
i:0;
a:3:{
s:2:"ItemID";
s:1:"1";
s:4:"Name";
s:10:"Dennis Dish";
s:12:"Phone Number";
s:12:"01225 123456";
}
i:1;
a:3:{
s:2:"ItemID";
s:1:"2";
s:4:"Name";
s:13:"Sally Spatula";
s:12:"Phone Number";
s:12:"01225 654321";
}
i:2;
a:3:{
s:2:"ItemID";
s:1:"3";
s:4:"Name";
s:10:"Terry Tins";
s:12:"Phone Number";
s:12:"01225 789456";
}
}';
WITH
names(itemID, ps) AS -- extract the names
(
SELECT
ROW_NUMBER() OVER (ORDER BY position),
SUBSTRING
(
@yourstring,
position+7,
CHARINDEX(';', @yourstring, position+7)-(position+8)
)
FROM dbo.NGrams8k(@yourstring, 7)
WHERE token = '"Name";'
),
phoneNbrs(itemID, ps) AS -- extract the phone numbers
(
SELECT
ROW_NUMBER() OVER (ORDER BY position),
SUBSTRING
(
@yourstring,
position+15,
CHARINDEX(';', @yourstring, position+15)-(position+16)
)
FROM dbo.NGrams8k(@yourstring, 15)
WHERE token = '"Phone Number";'
)
SELECT
id = 1,
n.itemID,
[Name] = SUBSTRING(n.ps, CHARINDEX('"', n.ps)+1, 100),
[Phone Number] = SUBSTRING(p.ps, CHARINDEX('"', p.ps)+1, 30)
FROM names n
JOIN phoneNbrs p ON n.itemID = p.itemID;
结果:
| ID | ItemID | Name | Phone Number |
|--------|--------|---------------|--------------|
| 1 | 1 | Dennis Dish | 01225 123456 |
| 1 | 2 | Sally Spatula | 01225 654321 |
| 1 | 3 | Terry Tins | 01225 789456 |