繁体   English   中英

从大字符串 SQL 中提取特定值

[英]Extracting specific value from large string SQL

我使用了 CHARINDEX 和 SUBSTRING 的组合,但无法正常工作。

我在 SQL 中传递了一个变量,该变量包含大量文本,但其中包含 email。 我需要提取 email 值。

我必须使用 SQL 2008。

我正在尝试提取“EmailAddress”:“”之间的值,

示例字符串在这里:

{  "Type":test,
   "Admin":test,
   "User":{
      "UserID":"16959191",
      "FirstName":"Test",
      "Surname":"Testa",
      "EmailAddress":"Test.Test@test.com",
      "Address":"Test"
}
}

假设您无法升级到 2016 或更高版本,您可以使用substringcharindex的组合。
我使用了一个通用的表表达式来减少麻烦,但你不必这样做。

DECLARE @json varchar(4000) = '{  "Type":test,
   "Admin":test,
   "User":{
      "UserID":"16959191",
      "FirstName":"Test",
      "Surname":"Testa",
      "EmailAddress":"Test.Test@test.com",
      "Address":"Test"
}
}';

WITH CTE AS
(
    SELECT @Json as Json,
    CHARINDEX('"EmailAddress":', @json) + LEN('"EmailAddress":') As StartIndex
)

SELECT SUBSTRING(Json, StartIndex, CHARINDEX(',', json, StartIndex) - StartIndex)
FROM CTE

结果: "Test.Test@test.com"

第一个提示是:如果可能,请移至 v2016,以原生使用 JSON 支持。 v2008绝对过时了...

第二个提示是:任何字符串操作(以及我下面的所有方法也需要一些字符串操作),都会受到禁止字符、意外空白或您可能在数据中发现的任何其他意外的影响。

试试这样:

首先,我创建一个模型场景来模拟您的问题

DECLARE @tbl TABLE(ID INT IDENTITY,YourJson NVARCHAR(MAX));
INSERT INTO @tbl VALUES
 (N'{  "Type":"test1",
   "Admin":"test1",
   "User":{
      "UserID":"16959191",
      "FirstName":"Test1",
      "Surname":"Test1a",
      "EmailAddress":"Test1.Test1@test.com",
      "Address":"Test1"
      }
}')
,(N'{  "Type":"test2",
   "Admin":"test2",
   "User":{
      "UserID":"16959191",
      "FirstName":"Test2",
      "Surname":"Test2a",
      "EmailAddress":"Test2.Test2@test.com",
      "Address":"Test2"
      }
}');

--从 v2016 开始支持 JSON

SELECT JSON_VALUE(t.YourJson, '$.User.EmailAddress')
FROM @tbl t

--String-methods --use CHARINDEX AND SUBSTRING

DECLARE @FirstBorder NVARCHAR(MAX)='"EMailAddress":';
DECLARE @SecondBorder NVARCHAR(MAX)='",';

SELECT t.*
      ,A.Pos1
      ,B.Pos2
      ,SUBSTRING(t.YourJson,A.Pos1,B.Pos2 - A.Pos1) AS ExtractedEMail
FROM @tbl t
OUTER APPLY(SELECT CHARINDEX(@FirstBorder,t.YourJson)+LEN(@FirstBorder)) A(Pos1)
OUTER APPLY(SELECT CHARINDEX(@SecondBorder,t.YourJson,A.Pos1)) B(Pos2);

--使用 XML 技巧

SELECT CAST('<x>' + REPLACE(REPLACE((SELECT t.YourJson AS [*] FOR XML PATH('')),'"EmailAddress":','<mailAddress value='),',',' />') + '</x>' AS XML)
      .value('(/x/mailAddress/@value)[1]','nvarchar(max)')
FROM @tbl t

一些解释:

  • JSON 支持将直接从 JSON 路径解析值。
  • 对于 CHARINDEX 和 SUBSTRING 我使用APPLY 优点是,您可以像变量一样使用计算出的位置。 无需一遍又一遍地重复 CHARINDEX 语句。
  • XML 方法会将您的 JSON 转换为一个相当奇怪和丑陋的 XML。 唯一有意义的元素是具有属性value<mailAddress> 我们可以使用本机 XML 方法.value()来检索您要求的值:

中间 XML 如下所示:

<x>{  "Type":"test1" /&gt;
       "Admin":"test1" /&gt;
       "User":{
          "UserID":"16959191" /&gt;
          "FirstName":"Test1" /&gt;
          "Surname":"Test1a" /&gt;
          <mailAddress value="Test1.Test1@test.com" />
          "Address":"Test1"
          }
    }</x>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM