我有一个包含键值对的 SQL 表,如下所示:
钥匙 | 价值 |
---|---|
产品_id | iphone_14 |
产品_id | iphone_14_pro |
国家代码 | 美国 |
国家代码 | CA |
这些行标识允许的键值对,这意味着如果键和值的组合不在表中,则该组合无效。
在 API 请求中,我将收到动态键值对,我需要确定其中哪些是无效。
例如,当我得到这些数据时:
[
{
"key": "product_id",
"value": "iphone_14"
},
{
"key": "product_id",
"value": "iphone_14_pro"
},
{
"key": "country_code",
"value": "INVALID_VALUE"
},
{
"key": "country_code",
"value": "USA"
}
]
我们可以说数组中的第 3 项无效,因为
INVALID_VALUE
不在 country_code
的允许值列中。
我如何编写一个 SQL 查询来识别传递的无效键值对。就像在本例中一样,我必须确定无效的
key
是 country_code
,无效的 value
是 INVALID_VALUE
(数组中的#3 项)。
请注意:所有数据都是动态的。
UPD:我正在使用 SAP HANA dbms,但我知道没有那么多人使用它。所以,也许答案可以提供一些关于如何做到这一点的一般准则。
一个简单但性能不是很好的解决方案是循环通过 API 收到的键值对,然后查询提供的键值对是否在具有有效组合的表中。像这样(伪代码)
for k, v in kvpairsreceived do
rowsfound = query("SELECT COUNT(0) FROM tablewithvalidcombos WHERE Key = k AND Value = v")
if rowsfound < 1
reportInvalidPair(k,v)
在不了解更多细节的情况下,很难确定在您的环境中最有效的解决方案是什么。但是,如果您正在寻找一个基于 JSON 输入完成工作的语句,您可以考虑使用函数 JSON_TABLE:
SELECT *
FROM JSON_TABLE('[
{"key": "product_id","value": "iphone_14"},
{"key": "product_id","value": "iphone_14_pro"},
{"key": "country_code","value": "INVALID_VALUE"},
{"key": "country_code","value": "USA"}
]', '$'
COLUMNS
(
KEY nvarchar(20) PATH '$.key',
VALUE nvarchar(20) PATH '$.value'
)
) WHERE (KEY, VALUE) NOT IN (SELECT KEY, VALUE FROM VALIDATION)