【问题标题】:Mysql Regexp Select By NumberMysql正则表达式按数字选择
【发布时间】:2014-06-26 22:06:07
【问题描述】:

大家好,我在数据库中有一个字段作为 json 字段

table some_table

field|   {"number":34,"name":"john"}
field|   {"number":60,"name":"mary"}
field|   {"number":44,"name":"mark"}

我想查询并选择数字 > 某个值的数据

select from some_table where field regexp (get_number) > 40

这可能吗?


我发现这个例子做一个正则表达式选择,但只匹配数据

SELECT id FROM table_name WHERE field_name REGEXP '"key_name":"([^"]*)key_word([^"]*)"';

但我想在 json 中进行选择,其中一些数字大于...

感谢大家未来的帮助。

【问题讨论】:

  • Regex 不是检查数字范围的好选择。
  • 规范化数据库,停止这样存储数据
  • 你真的是在努力工作。您应该修改您的数据库设计,以便您可以查询每条数据。
  • 是的。 json的美妙之处在于可以解码
  • 嗨,谢谢。我在一个地方工作,这是他们为这个特定领域保存数据的方式。我不能直接对数据库进行更改。这就是他们在这个领域工作的方式,他们有很多记录。我知道这种方式根本不推荐。你还有什么想法吗???

标签: php mysql json


【解决方案1】:

首先,我想告诉你,你不能在mysql上提取正则表达式“捕获”,你只能“匹配”

第二,我想告诉你,下面的查询只有在“数字”是第一项时才有效

SELECT * FROM some_table WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(field,',',1),':',-1) > 40

这使用mysql的SUBSTRING_INDEX来获取第一个“,”之前的字符串 结果是: {“数字”:34

然后获取最后一个“:”之后的字符串(在这种情况下,也是第一个)

这将导致:

34

编辑: 这是另一个允许其他订单的版本

SELECT * FROM some_table WHERE SUBSTRING_INDEX(SUBSTRING_INDEX('{"number":34,"name":"john"}','"number":',-1),",",1) > 40

第一次调用:34,"name":"john"} 第二次调用:34

SUBSTRING_INDEX: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

【讨论】:

    【解决方案2】:

    你有能力在 MySQL 数据库上加载插件吗?如果是这样,这可能正是您正在寻找的:

    http://blog.kazuhooku.com/2011/09/mysqljson-mysql-udf-for-parsing-json.html

    编译并安装 mysql_json UDF 插件后,您将能够运行如下查询:

    SELECT whatever_columns
      FROM some_table
      WHERE json_get(field, 'number') > 40
    

    我还没有尝试过,但想看看它是否适合你。

    【讨论】:

    • 它与 albertdiones 方法一起使用。但也许这个插件也可以工作。 ty
    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2011-06-18
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多