0

你能帮我在Mysql中使用正则表达式吗?

我在表格中有这些行

{"id":"1","value":"2"},{"id":"2","value":["5"]}
{"id":"1","value":"2"},{"id":"2","value":["1","5","14"]}
{"id":"1","value":"2"},{"id":"2","value":["3","2","12"]}
{"id":"1","value":"2"},{"id":"2","value":["3","1"]}

我想要 SELECT -> 所有 id:2 和值为 5 的行(前 2 行)。

WHERE `extra_fields` REGEXP '"id":"2","value":\\["5"\\]' ;

我试过这个 REGEXP 但它不能正常工作。我的 REGEXP SELECT 只有第一行。

4

2 回答 2

4

尝试这个:

WHERE `extra_fields` REGEXP '"id":"2","value":\\[("[[:digit:]]*",)?"5"' ;
于 2013-06-19T14:57:39.877 回答
1

您应该重新考虑您的数据库架构:

假设您当前的表已命名main并且有一个名为的主键id并且它的类型是INT(10)并且它被设置为自动增量

main
  id           INT(10) PRIMARY KEY AUTOINCREMENT
  extra_fields TEXT    NOT NULL  -- bad

:extra fields看起来像一个字段的集合。每个字段都有一个 ID 和一组值:

fields
  id      INT(10) PRIMARY KEY AUTOINCREMENT
  type_id INT(10) NOT NULL
  main_id INT(10) NOT NULL
  values  TEXT    NOT NULL -- still bad

但是我们想在值内部搜索,所以让我们进一步规范化它(这总是一个好主意),并创建一个新表FIELD_VALUES。由于现在FIELDS表格现在只是所有对的集合idmain_id我们不需要这张表格,我们只剩下:

main
  id   INT(10) PRIMARY KEY AUTOINCREMENT
  ...

field_values
  id      INT(10) PRIMARY KEY AUTOINCREMENT 
  type_id INT(10) NOT NULL
  main_id INT(10) NOT NULL
  value   TEXT    NOT NULL

内容如

main_id type_id value
    1       1     2
    1       2     5
    2       1     2
    2       2     1
    2       2     5
    2       2     14
    ...

然后就可以轻松查询这张表了:

WHERE id IN(
  SELECT main_id
  FROM   field_values
  WHERE  type_id = 2
  AND    value   = 5
)

如果您的额外字段可以采用不同的形状并且您仍然希望它们可搜索,则您需要使用额外的表格来反映它们的形状。

如果您无法捕获 JSON 的整个形状(或者几乎是 JSON - 缺少外部的一对方括号)但您仍然希望它可以搜索,您可以制作一个索引表(就像field_values)和仍将原始 JSON 保留在主表中。然后,当索引表反映足够的 JSON 结构以进行搜索时就足够了。

于 2013-06-19T15:34:37.297 回答