【问题标题】:Return contents of string as set of records将字符串的内容作为记录集返回
【发布时间】:2017-09-30 05:05:30
【问题描述】:

我正在尝试从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";
                }
    }

我不确定从哪里开始将原始字符串中的数据作为结果集返回。

任何指针将不胜感激。

【问题讨论】:

    标签: tsql ssms gravity-forms-plugin ssms-2012


    【解决方案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 |
    

    【讨论】:

    • 感谢您的文章,Alan - 我需要一段时间才能完全消化和理解如何让 NGrams8K 函数返回我需要的内容,但它看起来确实很有趣。
    • 道歉 - 最初没有注意到您在第一个代码块中的其余答案。非常感谢 - 这似乎有效。现在将对其进行调整,使其可以从表列而不是声明的变量中读取@yourstring
    • 快速提问 - 上面使用的position 是什么?我以前没有遇到过它作为关键字,也找不到任何有关它的信息。
    • 我很高兴这对你有用,马特。位置表示字符在字符串中的位置。为了更好地理解我的意思,您可以运行以下查询: SELECT * FROM dbo.NGrams8k('abc123', 1);选择 * 从 dbo.Ngrams8k('abc123', 2); SELECT * FROM dbo.NGrams8k('abc123', 3);
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多