我试图编写一个相当复杂的SQL查询来生成JSON。除了一些硬编码数组,我需要在层次结构中有更深层次的东西,我必须使用UNION ALL
来创建。我已经产生了查询,这里显示了我的问题(没有数据是必需的 - 我在Azure的SQL数据库上运行此):如何避免FOR JSON PATH逃离查询结果?
SELECT
'Hi' AS Greeting,
(
SELECT
CASE WHEN DatePart(second, GetDate()) % 2 = 1 THEN
'qwerty'
ELSE
'asdf'
END AS Stuff
FOR JSON PATH
) AS StuffArray,
(
CASE WHEN DatePart(second, GetDate()) % 2 = 1 THEN
(
SELECT 'qwerty' AS Stuff
FOR JSON PATH
)
ELSE
(
SELECT 'asdf' AS Stuff
FOR JSON PATH
)
END
) AS QuotedStuffArray,
(
CASE WHEN DatePart(second, GetDate()) % 2 = 1 THEN
(
SELECT * FROM
(
SELECT 'qwerty' AS Stuff
UNION ALL
SELECT 'zxcvb' AS Stuff
) AS SubSelect
FOR JSON PATH
)
ELSE
(
SELECT 'asdf' AS Stuff
FOR JSON PATH
)
END
) AS WhyItMatters,
(
SELECT * FROM
(
SELECT 'qwerty' AS Stuff
UNION ALL
SELECT 'zxcvb' AS Stuff
) AS SubSelect
FOR JSON PATH
) AS ButThisIsFine
FOR JSON PATH
这个输出该JSON:
[
{
"Greeting": "Hi",
"StuffArray": [
{
"Stuff": "qwerty"
}
],
"QuotedStuffArray": "[{\"Stuff\":\"qwerty\"}]",
"WhyItMatters": "[{\"Stuff\":\"qwerty\"},{\"Stuff\":\"zxcvb\"}]",
"ButThisIsFine": [
{
"Stuff": "qwerty"
},
{
"Stuff": "zxcvb"
}
]
}
]
在此查询,您会在基础对象之外的层次结构中看到四个不同的对象:StuffArray
,QuotedStuffArray
,WhyItMatters
和ButThisIsFine
。 StuffArray
对象正是我希望我的所有对象看起来像 - 纯JSON没有任何转义。但是,当我开始将SELECT
语法放入我的CASE
语句中时,我的结果开始引用,如QuotedStuffArray
对象所示。所以对于前两个对象,这很好。但我有一个问题,我有时需要执行两个硬编码值的条件UNION
,这迫使我将SELECT
放入CASE
语句中,如WhyItMatters
对象所示。 ButThisIsFine
对象产生格式化的输出,就像我想WhyItMatters
对象被格式化,但它删除了我需要的条件UNION
。
我怎样才能得到这最后WhyItMatters
对象产生纯粹的JSON没有像ButThisIsFine
对象逃脱报价,同时保持在条件UNION
陈述?
我的眼睛正在流血,但在'SELECT'(而不是简单的圆括号)周围添加了'JSON_QUERY()'来达到你想要的效果吗? –
@JeroenMostert是的!请提供该答案作为答案,我会接受它。比我作为可能的解决方案发布的要好得多。谢谢! – Jaxidian
@Jaxidian但是你的解决方案可能有更好的性能?你可以测试吗? –