在 SQL 中如何根据键值列验证动态键值对

问题描述 投票:0回答:2

我有一个包含键值对的 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,但我知道没有那么多人使用它。所以,也许答案可以提供一些关于如何做到这一点的一般准则。

sql hana
2个回答
0
投票

一个简单但性能不是很好的解决方案是循环通过 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)

0
投票

在不了解更多细节的情况下,很难确定在您的环境中最有效的解决方案是什么。但是,如果您正在寻找一个基于 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)
© www.soinside.com 2019 - 2024. All rights reserved.