如何使用Sqlite检查数组是否包含JSON列中的项?

vof42yt1  于 2022-12-13  发布在  SQLite
关注(0)|答案(1)|浏览(297)

我使用sqlite来存储JSON数据,我无法控制这些数据。我有一个logs表,如下所示。
| 标识符|价值|
| - -|- -|
| s8 i13 s85 e8 f34 zm 8vikkcv 5 n的一个例子|{“密钥”:[“a”,“B”]}|
| m2 abxfn 2n 9 pkyc 9 kjmko 5462的一个例子|{“键”:“一些文本”}|
然后使用以下查询获取value.key中包含a的行:

SELECT * FROM logs WHERE EXISTS (SELECT * FROM json_each(json_extract(logs.value,'$.key')) WHERE json_each.value = 'a')

如果key是一个数组或者它不存在,查询就可以正常工作。但是如果是一个字符串(如表的第二行),查询就会失败。
我得到的错误是:
SQL error or missing database (malformed JSON)
这是因为如果参数是字符串,则json_each会引发。
由于需求,我无法控制用户数据或查询。
理想情况下,我希望找出一个查询,它要么不会失败,要么检测到值是字符串而不是数组,并使用LIKE来查看字符串是否包含'a'
任何帮助都将不胜感激。节日快乐:)

cigdeys3

cigdeys31#

WHERE子句中使用CASE表达式,检查值是否为数组:

SELECT * 
FROM logs 
WHERE CASE
  WHEN value LIKE '{"key":[%]}' THEN
    EXISTS (
     SELECT * 
     FROM json_each(json_extract(logs.value,'$.key')) 
     WHERE json_each.value = 'a'
    )
  ELSE json_extract(value,'$.key') = 'a'
END;

请参阅demo

相关问题