所以,假设我在表中有一个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但到目前为止我不知道该怎么办.
任何想法和帮助表示赞赏.谢谢!
你可以使用函数实现它:
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)