我如何在从 table 中选择时忽略 json 值?

How I ignore json values while selecting from table?

我的评论table有一列回复(类型-nvarchar(max))我把所有回复。是一个json的数组,像

[
{
  "Name":{
     "First":"Peter",
     "Last":"Vogel"
  },
  "Text":"Hi",
  "Date":"2017-09-30"
},
{
  "Name":{
     "First":"Jan",
     "Last":"Irvine"
  },
  "Text":"Hello",
  "Date":"2015-01-14"
}
]

我不想在从评论中选择时获取日期。我该怎么做?

我试过类似的解决方案,

 select  new_replies = JSON_MODIFY([replies], '$[0].date', null)

但此设置 NULL 日期字段仅针对第一个回复,而不是针对所有回复。

JSON_MODIFY() 期望数组项的索引修改它的内容,我不认为您可以在这种情况下使用通配符。但是一种基于 OPENJSON() 和字符串聚合的组合的方法是一种选择:

Table:

SELECT *
INTO Comments
FROM (VALUES (N'[
{
"Name":{
    "First": "Peter", 
    "Last": "Vogel"
}, 
 "text": "Hi", 
 "date": "017-09-30"
},
{
"Name":{
    "First": "Jan", 
    "Last": "Irvine"
}, 
 "text": "Hello", 
 "date":"2015-01-14"
}
]')
) v (Replies)

声明(适用于 SQL Server 2017+):

SELECT NewReplies = (
   SELECT CONCAT('[', STRING_AGG(JSON_MODIFY([value], '$.date', NULL), ','), ']')
   FROM OPENJSON(Replies)
)   
FROM Comments

声明(针对 SQL Server 2016):

SELECT NewReplies = CONCAT(
   '[',
   STUFF(
      (
      SELECT ',' + JSON_MODIFY([value], '$.date', NULL) 
      FROM OPENJSON(Replies)
      FOR XML PATH(''), TYPE
      ).value('.', 'nvarchar(max)'), 1, 1, ''
   ),
   ']'
)   
FROM Comments

结果:

NewReplies
-----------------------
[{
"Name":{
    "First": "Peter", 
    "Last": "Vogel"
}, 
 "text": "Hi"
},{
"Name":{
    "First": "Jan", 
    "Last": "Irvine"
}, 
 "text": "Hello"
}]