假設我有一個Image帶有 JSON 元列的表:
| ID | 元 |
|---|---|
| 1 | {“尺寸”:80,“效果”:“模糊”} |
| 2 | {“大小”:200,“優化”:真} |
| 3 | {“顏色”:“#abcdef”,“ext”:“.jpg”} |
我有一個像這樣的表格型別的動態引數
| 鑰匙 | 價值 |
|---|---|
| 尺寸 | 200 |
| 優化 | 真的 |
我應該如何撰寫查詢來過濾 Meta 列的鍵值對與 param 表中的所有值匹配的行?
SELECT Id
FROM Image
WHERE (
--?? all keys and values matched the param table
)
uj5u.com熱心網友回復:
這是一種型別的關系除法(有余數)問題,同時具有粉碎 JSON 的額外扭曲。
這類問題有多種解決方案。一種常見的解決方案是LEFT JOIN將除數除數,將其分組并檢查是否有任何不匹配:
DECLARE @tmp TABLE (
"Key" NVARCHAR(8) COLLATE Latin1_General_BIN2,
"Value" NVARCHAR(4) COLLATE Latin1_General_BIN2
);
INSERT INTO @tmp
("Key", "Value")
VALUES
('size', '200'),
('optimize', 'true');
SELECT *
FROM Image i
WHERE EXISTS (SELECT 1
FROM @tmp t
LEFT JOIN OPENJSON(i.Meta) j ON t.[Key] = j.[key] AND t.Value = j.value
HAVING COUNT(j.value) = COUNT(*) -- all match
);
另一種解決方案是使用雙精度NOT EXISTS:沒有不匹配的鍵/值輸入對
DECLARE @tmp TABLE (
"Key" NVARCHAR(8) COLLATE Latin1_General_BIN2,
"Value" NVARCHAR(4) COLLATE Latin1_General_BIN2
);
INSERT INTO @tmp
("Key", "Value")
VALUES
('size', '200'),
('optimize', 'true');
SELECT *
FROM Image i
WHERE NOT EXISTS (SELECT 1
FROM @tmp t
WHERE NOT EXISTS (SELECT 1
FROM OPENJSON(i.Meta) j
WHERE t.[Key] = j.[key] AND t.Value = j.value
)
);
db<>小提琴
YMMV 關于哪種解決方案更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422064.html
標籤:
上一篇:SQL左連接避免重復
