如何补全SQL查询以仅筛选category值为xyz的记录
修改方案
直接在查询末尾新增WHERE子句,匹配JSON路径提取出的category值即可。注意SQL执行顺序中WHERE子句早于SELECT计算,不能直接引用SELECT中定义的Value_reported别名。
最简修改版(直接追加筛选条件)
SELECT JSON_VALUE(doc, '$.category' ) AS Value_reported FROM OPENROWSET(BULK 'https://azdevstoreforlogs.blob.core.windows.net/inews/resourceId=/SUBSCRIPTIONS/531B20C3AEB/RESOURCEGROUPS/AZURE-DEV/PROVIDERS/MICROSOFT.CONTAINERSERVICE/MANAGEDCLUSTERS/AZURE-DEV/y=2022/m=05/d=23/h=13/m=00/PT1H.json', FORMAT = 'csv', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b') WITH (doc nvarchar(max)) AS rows WHERE JSON_VALUE(doc, '$.category') = 'xyz'
可读性优化版(CTE包装,支持别名筛选)
如果后续需要提取更多JSON字段做筛选、聚合,建议用CTE先统一完成字段解析,外层再做筛选,避免重复书写JSON_VALUE逻辑:
WITH ParsedLogs AS ( SELECT JSON_VALUE(doc, '$.category' ) AS Value_reported -- 可在此处新增其他需要提取的JSON字段 FROM OPENROWSET(BULK 'https://azdevstoreforlogs.blob.core.windows.net/inews/resourceId=/SUBSCRIPTIONS/531B20C3AEB/RESOURCEGROUPS/AZURE-DEV/PROVIDERS/MICROSOFT.CONTAINERSERVICE/MANAGEDCLUSTERS/AZURE-DEV/y=2022/m=05/d=23/h=13/m=00/PT1H.json', FORMAT = 'csv', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b') WITH (doc nvarchar(max)) AS rows ) SELECT Value_reported FROM ParsedLogs WHERE Value_reported = 'xyz'
两种写法执行性能无差异,SQL Server查询优化器会自动完成谓词下推,不会出现全量加载数据后再筛选的性能问题。
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

