您的 JSON 在这两个示例之间是一致的,还是它们都是完全随机的?
如果您有两种不同的 JSON 结构,您可以在 WHERE 子句中使用 JSON_VALUE 和 OR。
您可以在 SSMS 中运行以下示例:
DECLARE @Data table ( id int, jsn nvarchar(MAX) );
INSERT INTO @Data VALUES
( 1, '{"DefinitionKey": "DocumentRelease","variables": {"isError": false,"ProcessItem": {"NamedValues":{"{|CompanyNumber|}": "90077"},"Department": null,"Tester": null,"ResponsibleAgents": "netCo.Demo\\CGiesen"}}}' ),
( 2, '{"DefinitionKey": "DocumentRelease","{|CompanyNumber|}": "90077","variables":{"isError": false,"ProcessItem":{"NamedValues": {},"Department": null,"Tester": null,"ResponsibleAgents": "netCo.Demo\\CGiesen"}}}' );
SELECT
jsn
FROM @Data
WHERE
JSON_VALUE ( jsn, '$."{|CompanyNumber|}"' ) = '90077'
OR
JSON_VALUE ( jsn, '$.variables.ProcessItem.NamedValues."{|CompanyNumber|}"' ) = '90077';
返回
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| jsn |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {"DefinitionKey": "DocumentRelease","variables": {"isError": false,"ProcessItem": {"NamedValues":{"{|CompanyNumber|}": "90077"},"Department": null,"Tester": null,"ResponsibleAgents": "netCo.Demo\\CGiesen"}}} |
| {"DefinitionKey": "DocumentRelease","{|CompanyNumber|}": "90077","variables":{"isError": false,"ProcessItem":{"NamedValues": {},"Department": null,"Tester": null,"ResponsibleAgents": "netCo.Demo\\CGiesen"}}} |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
更新:
“它们都是完全随机的……”
在这种情况下,我(个人)会使用内联表值函数进行字符串解析。
这是我为内联 TVF 编写的代码:
CREATE FUNCTION dbo.GetValue (
@json nvarchar(MAX),
@key nvarchar(255)
)
RETURNS TABLE
AS
RETURN (
SELECT
REPLACE ( key_value, '"', '' ) AS key_value --strip double quotes.
FROM (
-- Get the initial part of @key's string
SELECT SUBSTRING (
@json,
CHARINDEX ( @key, @json ) + LEN ( @key ),
LEN ( @json )
) AS key_string
) AS x
CROSS APPLY (
-- Get @key's value from [key_string] (expects a quoted value)
SELECT SUBSTRING (
x.key_string,
CHARINDEX ( '"', x.key_string),
CHARINDEX ( '"', x.key_string, CHARINDEX ( '"', x.key_string ) + 1 ) - 1
) AS key_value
) AS n
);
您可以针对我的示例(更新)@Data 表调用此内联 TVF,如下所示:
SELECT
id, key_value
FROM @Data
OUTER APPLY dbo.GetValue( jsn, '"{|CompanyNumber|}":' ) AS x
WHERE
key_value = '90077';
返回:
+----+-----------+
| id | key_value |
+----+-----------+
| 1 | 90077 |
| 2 | 90077 |
+----+-----------+
(排除列jsn以节省空间)
请注意,键名作为'"{|CompanyNumber|}":' 传递,这是完整键名,包括引号和冒号。
我提供的内联 TVF 期望返回值 @key 被引用。