在对象数组内创建特定JSON值的索引

Gas*_*a79 3 t-sql sql-server

所以,假设我在表中有一个varchar列,其结构如下:

{
   "Response":{
      "DataArray":[
         {
            "Type":"Address",
            "Value":"123 Fake St"
         },
         {
            "Type":"Name",
            "Value":"John Doe"
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

我想在"DataArray"数组元素的"Value"字段上创建一个持久计算列,其中包含一个等于"Name"的Type字段.(我希望我能正确解释.基本上我想索引该结构上的人名).

问题是,与其他json对象不同,我无法JSON_VALUE以简单的方式使用该函数来提取所述值.我不知道这是否可以做到,我一直在涉足JSON_QUERY但到目前为止我不知道该怎么办.

任何想法和帮助表示赞赏.谢谢!

Luk*_*zda 5

你可以使用函数实现它:

CREATE FUNCTION dbo.my_func(@s NVARCHAR(MAX))
RETURNS NVARCHAR(100)
WITH SCHEMABINDING
AS
BEGIN
   DECLARE @r NVARCHAR(100);

   SELECT @r = Value 
   FROM OPENJSON(@s,'$.Response.DataArray')  
   WITH ([Type] NVARCHAR(100) '$.Type', [Value] NVARCHAR(100) '$.Value')
   WHERE [Type] = 'Name';

   RETURN @r;
END;
Run Code Online (Sandbox Code Playgroud)

定义表:

CREATE TABLE tab(
  val NVARCHAR(MAX) CHECK (ISJSON(val) = 1),
  col1 AS dbo.my_func(val) PERSISTED        -- calculated column
);
Run Code Online (Sandbox Code Playgroud)

样本数据:

INSERT INTO tab(val) VALUES (N'{
   "Response":{
      "DataArray":[
         {
            "Type":"Address",
            "Value":"123 Fake St"
         },
         {
            "Type":"Name",
            "Value":"John Doe"
         }
      ]
   }
}');

CREATE INDEX idx ON tab(col1);   -- creating index on calculated column

SELECT * FROM tab;
Run Code Online (Sandbox Code Playgroud)

db <>小提琴演示