【问题标题】:Use SQL REGEXP to ignore number and get only String and '/'使用 SQL REGEXP 忽略数字并仅获取 String 和 '/'
【发布时间】:2019-12-06 14:22:16
【问题描述】:

我有一个 MySQL 表,其中有一列类型为 varchar(255) 的列,其中包含以下格式的数据:

400 mg
50/12,5 mg/ml
20 mikrog
500 mg/400 IU
60 mikrog/15 mikrog

我需要忽略数字,只提取字符串,在某些情况下,包括/,因此上面的数据如下所示:

mg
mg/ml
mikrog
mg/IU
mikrog/mikrog

我尝试像这样使用REGEXP

SELECT DISTINCT REGEXP_SUBSTR(column, '[a-z]') FROM db.table;

但是,这只是给了我一堆字母,像这样

m
I
U
a
g
k

有没有什么方法可以使用REGEXP提取任意长度的String,就我而言,需要提取的String长度不等,例如mg,就是2,在mikrog 的情况是 6。另外,在某些情况下,我需要包含字符 /

【问题讨论】:

  • 好像你的数据库版本是8+,不是吗?
  • @BarbarosÖzhan 是的
  • 在您的应用程序中解析您的数据,不是在 SQL 中。

标签: mysql regex mysql-8.0


【解决方案1】:

如果你想使用正则表达式

尝试使用[a-z]* 只获取所有字母, 或[a-z]*\/[a-z]* 连斜线。

看看here 并测试一些示例

【讨论】:

    【解决方案2】:

    最简单的方法是使用instr()substring()

    select substring(col, instr(col, ' '))
    from your_table
    

    SQLFiddle demo

    【讨论】:

      【解决方案3】:

      您可以删除数字以获得所需的内容:

      REGEXP_REPLACE(column, ' *[0-9]+([.,][0-9]+)?(/[0-9]+([.,][0-9]+)?)? *', '')
      

      请参阅regex demo

      详情

      • * - 0+ 个空格
      • [0-9]+ - 1 位以上
      • ([.,][0-9]+)? - 可选的逗号或句点序列,后跟 1 个以上数字
      • (/[0-9]+([.,][0-9]+)?)? - / 的可选序列,然后是 1+ 位数字,后跟可选的 ., 和 1+ 位数字
      • * - 0+ 个空格

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 2022-10-21
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多