我正在使用SQL Server查询构造JSON对象。我在斜杠方面遇到问题,而且我还需要特定格式的数据,如下所述。实际输出中带有斜线。我想从输出查询中消除斜线。
SELECT (SELECT
('{'+'"value":'+ cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_NUMBER,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_NUMBER
,( '{' +'"value":'+cast(ISNULL(SP.NUMBER_OF_VEHICLES ,'') as varchar) ) AS NUMBER_OF_VEHICLES
,( '{' +'"value":'+cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_START_H_DATE,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_START_H_DATE
,( '{' +'"value":'+cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE ,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_END_H_DATE
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_MORROR_STATUS,'') as varchar) ) AS SUSPENSION_BY_MORROR_STATUS
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_VIOLATION ,'') as varchar) ) AS SUSPENSION_BY_VIOLATION
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_PENALTY ,'') as varchar) ) AS SUSPENSION_BY_PENALTY
from [dbo].[TAMM_CAC_ACCOUNTS_STG] SP
where SP.Account_Reference_Number = CAC.Account_Reference_Number
AND (
ACCOUNT_TRAFFIC_DEP_LICENSE_NUMBER IS NOT NULL OR
NUMBER_OF_VEHICLES IS NOT NULL OR
SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE IS NOT NULL OR
SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE IS NOT NULL OR
SP.SUSPENSION_BY_MORROR_STATUS IS NOT NULL OR
SP.SUSPENSION_BY_VIOLATION IS NOT NULL OR
SP.SUSPENSION_BY_PENALTY IS NOT NULL ) FOR JSON PATH,INCLUDE_NULL_VALUES
) AS specifics
from dbo.Customer_Account CAC
上面的查询给了我想要的输出,但是有反斜杠。
[
{
"TRAFFIC_DEP_LICENSE_NUMBER": "{\"value\":0",
"NUMBER_OF_VEHICLES": "{\"value\":1009",
"TRAFFIC_DEP_LICENSE_START_H_DATE": "{\"value\":14351229",
"TRAFFIC_DEP_LICENSE_END_H_DATE": "{\"value\":14351229",
"SUSPENSION_BY_MORROR_STATUS": "{\"value\":0",
"SUSPENSION_BY_VIOLATION": "{\"value\":1",
"SUSPENSION_BY_PENALTY": "{\"value\":1"
}
]
实际预期输出低于
“specific”:{
"TRAFFIC_DEP_LICENSE_NUMBER":{“value”:0},
"NUMBER_OF_VEHICLES":{“value”:22},
"TRAFFIC_DEP_LICENSE_START_H_DATE":{“value”: 14480608},
"TRAFFIC_DEP_LICENSE_END_H_DATE":{“value”: 14480608},
"SUSPENSION_BY_MORROR_STATUS":{“value”:0},
"SUSPENSION_BY_VIOLATION":{“value”:1},
"SUSPENSION_BY_PENALTY":{“value”:1},
}
答案 0 :(得分:1)
在任何使用字符串值的地方,都可以使用STRING_ESCAPE: 例如:
SELECT STRING_ESCAPE('\ /
\\ " ', 'json') AS escapedText;
返回:
escapedText
-------------------------------------------------------------
\\\t\/\n\\\\\t\"\t
答案 1 :(得分:1)
如果我正确理解了您的问题,并且希望删除特殊字符的转义,那么下一个解决方案可能会有所帮助。
FOR JSON
子句escapes与JSON
输出的\
中的特殊字符。
...如果源数据包含特殊字符,则为FOR JSON 子句使用\在JSON输出中对其进行转义,如 下表。转义在属性名称中都发生 和他们的价值观。 ...
如果确定可以生成有效的JSON
,则可以尝试使用JSON_QUERY with FOR JSON。
... JSON_QUERY返回有效的JSON片段。结果,FOR JSON 不会在JSON_QUERY返回值中转义特殊字符。 ...
一个简单的示例,演示您的问题:
-- Statement:
SELECT (
SELECT '{"value": 1}' AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics
-- Output:
-------------------------------------------------
specifics
-------------------------------------------------
[{"TRAFFIC_DEP_LICENSE_NUMBER":"{\"value\": 1}"}]
解决方案:
-- Statement:
SELECT (
SELECT JSON_QUERY('{"value": 1}') AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics
-- Output:
-------------------------------------------------
specifics
-------------------------------------------------
[{"TRAFFIC_DEP_LICENSE_NUMBER":{"value": 1}}]
注意:
您可以使用ISJSON检查JSON:
SELECT (
SELECT CASE
WHEN ISJSON('{"value": 1}') = 1 THEN JSON_QUERY('{"value": 1}')
ELSE 'Imvalid JSON'
END AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics