SQL 服务器 OPENJSON 在一个文件中有多个位置
SQL server OPENJSON with multiple where on a filed
我有一个带有 json
字段的 table。 json
架构对于所有记录都是相同的。
我只想购买 2 件颜色为 red
或 blue
且颜色为 brand 1
的产品。
我尝试了以下查询,但我知道它不起作用:
SELECT [Id], [JName], [JValue]
FROM [Product]
CROSS APPLY OPENJSON([Json])
WITH ([JName] NVARCHAR(50) '$.name', [JValue] NVARCHAR(50) '$.value')
WHERE
(CASE WHEN [JName]=N'color' AND [JValue] IN (N'red', N'red') THEN 1 ELSE 0 END) &
(CASE WHEN [JName]=N'brand' AND [JValue] IN (N'brand 1') THEN 1 ELSE 0 END) = 1
那么,这个查询应该怎么写呢?
我有点不确定你在问什么:
如何获取符合您的条件(红色或蓝色和品牌 1)的数据,因为您发布的查询不会得到您想要的。
或
如何为分页目的执行 OFFSET。
或
两者都有。
无论如何,在我上面的初始评论之后(但在您回复之前),我写了一个查询,它会为您提供您想要的(红色或蓝色和 Brand1)。
在您回复后,我修改了查询以执行 OFFSET
:
;WITH prod
AS
(
SELECT [Id], [JName], [JValue]
FROM dbo.tb_Product
CROSS APPLY OPENJSON([Json])
WITH ([JName] NVARCHAR(50) '$.name', [JValue] NVARCHAR(50) '$.value')
)
SELECT p1.Id, p1.JValue AS Color, p2.JValue AS Brand
FROM prod p1
JOIN prod p2
ON p1.Id = p2.Id
WHERE p1.JName = 'Color'
AND p1.JValue IN ('red', 'blue')
AND p2.JName = 'Brand'
AND p2.JValue IN ('Brand1')
ORDER BY p1.ID
OFFSET 0 ROWS
FETCH NEXT 2 ROWS ONLY;
希望这是您想要的。
我有一个带有 json
字段的 table。 json
架构对于所有记录都是相同的。
我只想购买 2 件颜色为 red
或 blue
且颜色为 brand 1
的产品。
我尝试了以下查询,但我知道它不起作用:
SELECT [Id], [JName], [JValue]
FROM [Product]
CROSS APPLY OPENJSON([Json])
WITH ([JName] NVARCHAR(50) '$.name', [JValue] NVARCHAR(50) '$.value')
WHERE
(CASE WHEN [JName]=N'color' AND [JValue] IN (N'red', N'red') THEN 1 ELSE 0 END) &
(CASE WHEN [JName]=N'brand' AND [JValue] IN (N'brand 1') THEN 1 ELSE 0 END) = 1
那么,这个查询应该怎么写呢?
我有点不确定你在问什么:
如何获取符合您的条件(红色或蓝色和品牌 1)的数据,因为您发布的查询不会得到您想要的。
或
如何为分页目的执行 OFFSET。
或
两者都有。
无论如何,在我上面的初始评论之后(但在您回复之前),我写了一个查询,它会为您提供您想要的(红色或蓝色和 Brand1)。
在您回复后,我修改了查询以执行 OFFSET
:
;WITH prod
AS
(
SELECT [Id], [JName], [JValue]
FROM dbo.tb_Product
CROSS APPLY OPENJSON([Json])
WITH ([JName] NVARCHAR(50) '$.name', [JValue] NVARCHAR(50) '$.value')
)
SELECT p1.Id, p1.JValue AS Color, p2.JValue AS Brand
FROM prod p1
JOIN prod p2
ON p1.Id = p2.Id
WHERE p1.JName = 'Color'
AND p1.JValue IN ('red', 'blue')
AND p2.JName = 'Brand'
AND p2.JValue IN ('Brand1')
ORDER BY p1.ID
OFFSET 0 ROWS
FETCH NEXT 2 ROWS ONLY;
希望这是您想要的。