对于以下查询,我在运行它时收到错误:

"JSON_VALUE或JSON_QUERY"的参数2必须是字符串文字.

SELECT JSON_QUERY(sr.Options, CONCAT('$[',sr.OptionId,']')
FROM Survey as sr

列‘Options’包含类似如下的JSON:[{"ID":1,"Text":"Yes"},{"ID":2,"Text":"No"}]和‘OptionID’与我想返回的其中一个选项的索引相关,但可以为空,在这种情况下,我不关心它返回什么."Options"有时也会是空数组"[]",但在这种情况下,"OptionId"始终为空.

这是针对SQL Server 13.0.4001运行的

我在JSON_QUERY的参数2上try 了各种操作,比如使用CASE语句仅在sr.OptionId不为NULL时使用它,try 转换类型,以及在整个查询上使用WHERE语句过滤掉NULL.

推荐答案

您可以try 使用带有默认模式的OPENJSON()和附加的APPLY运算符来执行不同的语句.调用OPENJSON()的结果是一个具有列keyvaluetype的表.在本例中,key列包含指定JSON数组中元素的索引,value列包含JSON对象.

样本数据:

SELECT *
INTO Survey
FROM (VALUES
   (0, '[{"Id":1,"Text":"Yes"},{"Id":2,"Text":"No"}]'), 
   (1, NULL),
   (NULL, '[]') 
) v (OptionId, Options) 

声明:

SELECT *
FROM Survey sr
OUTER APPLY (
   SELECT [value] AS OptionJson
   FROM OPENJSON(sr.Options)
   WHERE sr.OptionID = CONVERT(int, [key])
) oa

作为补充,正如@Alway sLearning已经 comments 的那样,错误的原因是在SQL Server 2017+中支持使用变量作为JSON_QUERY()中的路径的值.对于这些版本,您可以使用以下语句:

SELECT 
   sr.OptionId,
   sr.Options,
   CASE 
      WHEN sr.OptionId IS NOT NULL THEN JSON_QUERY(sr.Options, CONCAT('$[', sr.OptionId, ']')) 
   END AS OptionJson
FROM Survey sr

Sql相关问答推荐

查询将查找将标记设置为user2的用户

如何在T—SQL中找到值更改之前的日期?

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

SQL查询视图与连接?

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

为什么两个不同的窗口函数给出不同的排序结果?

PostgreSQL基于2个COLS的任意组合 Select 唯一行

将计算列设置为持久化的目的是什么?

删除所有订单中可用的重复值

Snowflake 中的分层数据

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

YEAR 函数仍然不可SARGable 吗?

在 postgres 中插入或更新 jsonb 数组的对象

识别SQL Server中的重复数字

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

标量子查询中的窗口函数不起作用

try 将多行折叠为单个结果

基于源表的 SQL INSERT、UPDATE 和 DELETE

如何根据 Amazon Athena 中的多个列值删除重复行?

REGEXP 用于字符串格式化以对用空格分隔的字符和数字进行分组