我正在使用Mysql触发器在我的数据库上执行某些操作。在任何事情之前,我想检查我的配置表中的json_encode字符串中是否存在值,然后继续运行触发器。 我的配置表由php脚本处理,如下所示:
-------------------------------------------
| config_name | config_value |
-------------------------------------------
| target_id | ["1","16","18","22","37"] |
-------------------------------------------
在php中我们可以使用:
如果是in_array(json_decode(config_value))和......
但我的问题是Mysql语法,它不支持in_array和json_decode
如何检查我的值是否存在于' config value'在Mysql触发器中?
答案 0 :(得分:4)
如果要在mysql中存储JSON,请确保升级到mysql 5.7,然后可以使用可用的JSON functions范围。在您的特定情况下,您可以
SELECT * FROM my_table WHERE JSON_SEARCH(config_value,"one", "17") IS NOT NULL;
您的数据存在问题。如果您发现始终在搜索JSON字段,那么真正意味着您的表应该被规范化。
更新:第2部分,标题已根据@Sammitch
的建议进行了更改答案 1 :(得分:0)
使用此:
@Query(value = "select * from configs where json_contains(config_value, json_array(?1))))", nativeQuery = true)
List<Config> list(String config);
答案 2 :(得分:0)
好的,所以你有一个 JSON_ARRAY()
来检查 JSON_ARRAY()
中是否存在特定的 id,只需简单地放置一个条件,即 JSON_CONTAINS(config_value,"1")=1
,所以如果“1”出现在 "..config_value=JSON_ARRAY(" . implode(',', $arr) . ") ...
你的 JSON_ARRAY() 那么它将返回 1 否则返回 0。
此外,在执行插入/更新查询时,您可以使用 [list(range(0,x)) for x in [1, 2, 3]]
答案 3 :(得分:-2)
感谢您的回复。但不幸的是,mysql版本是5.1,它是不可能升级它的。实际上我正在为voipswitch系统添加一些功能。因此,我的灵活性仅限于目前的功能。
我正在选择多种关税,我想记录插入的呼叫(在通过我的触发器在'呼叫'表中插入呼叫之后),这些呼叫属于列表中的选定资费,用于某些分析。
此外,我尝试使用php serialize函数代替json_encode将我的资费ID存储在配置表中。但是mysql也不支持反序列化。