在 MySql 中提取具有特定模式的子字符串

2024-03-05

我有一个文本字段,如下所示:

option[A]sum[A]g3et[B]

我想获取里面的文字[ ]没有重复项。 获得意义:

A
B

不可能出现双重like的情况[ [ ] ].

我知道这是一种在数据库中保存数据的可怕方法。我无法更改数据的保存方式。我只需要从本专栏中获取非常具体的(一次性)信息。

我尝试这样做:

SELECT substring_index(substring_index(sentence, '[', -1),']', 1)
FROM (SELECT 'THIS[A] IS A TEST' AS sentence) temp;

这给了我A,但这对很多人来说不起作用[].

我想过使用正则表达式,但我不知道有多少[ ] I have.

我怎么做?


这不是为了DB但有可能:

CREATE TABLE tab(id INT, col VARCHAR(100));           
INSERT INTO tab(id, col) 
VALUES (1, 'option[A]sum[A]g3et[B]'), (2, '[Cosi]sum[A]g3et[ZZZZ]');      

SELECT DISTINCT *
FROM (
  SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) AS val
  FROM
  (
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ']', n.n), ']', -1) AS val
    FROM tab t 
    CROSS JOIN 
    (
     SELECT a.N + b.N * 10 + 1 n
       FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ) n
    WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  ) sub
) s
WHERE val <> ''
ORDER BY ID;

SqlFiddleDemo http://sqlfiddle.com/#!9/277447/1/0

Note:

根据col您可能需要生成更多数字的最大长度CROSS JOIN部分。目前最多为100。

Output:

怎么运行的:

  1. 生成号码表CROSS JOIN
  2. 根据分割字符串]作为分隔符
  3. RIGHT(val, LENGTH(val) - LOCATE('[', val))删除部分直至[
  4. 过滤掉空记录
  5. 仅获取DISTINCT values

最里面的查询:

╔════╦══════════╗
║ id ║   val    ║
╠════╬══════════╣
║  1 ║ option[A ║
║  1 ║ sum[A    ║
║  1 ║ g3et[B   ║
║  1 ║          ║
╚════╩══════════╝

第二个子查询:

╔════╦═════╗
║ id ║ val ║
╠════╬═════╣
║  1 ║ A   ║
║  1 ║ A   ║
║  1 ║ B   ║
║  1 ║     ║
╚════╩═════╝

最外面的查询:

╔════╦═════╗
║ id ║ val ║
╠════╬═════╣
║  1 ║ A   ║
║  1 ║ B   ║
╚════╩═════╝

我需要每行查询的结果..不合并

所以添加简单的:

WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  AND t.id = ?

EDIT 2:

see http://sqlfiddle.com/#!9/8ee95/1 http://sqlfiddle.com/#!9/8ee95/1您的查询部分适用于我的数据。我还将类型更改为长文本。

您想在 MySQL 中解析 JSON。正如我之前所说,在应用层解析并获取值。这个答案仅用于演示/玩具目的,并且性能非常低。

如果你仍然坚持使用 SQL 解决方案:

SELECT id, val,s.n
FROM (
  SELECT id, RIGHT(val, LENGTH(val) - LOCATE('[', val)) AS val,n
  FROM
  (
    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ']', n.n), ']', -1) AS val, n.n
    FROM (SELECT id, REPLACE(col, '[]','') as col FROM tab) t
    CROSS JOIN 
    (
     SELECT e.N * 10000 + d.N * 1000 + c.N * 100 + a.N + b.N * 10 + 1 n
       FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) e

    ) n
    WHERE n.n <= 1 + (LENGTH(t.col) - LENGTH(REPLACE(t.col, ']', '')))
  ) sub
) s
WHERE val <> ''
GROUP BY id, val
HAVING n <> MAX(n)
ORDER BY id,n;

SqlFiddleDemo http://sqlfiddle.com/#!9/8ee95/24/0

Output:

╔═════╦═════════════╦════╗
║ id  ║    val      ║ n  ║
╠═════╬═════════════╬════╣
║  1  ║ CE31285LV4  ║  1 ║
║  1  ║ D32E        ║  3 ║
║  1  ║ GTX750      ║  5 ║
║  1  ║ M256S       ║  7 ║
║  1  ║ H2X1T       ║  9 ║
║  1  ║ FMLANE4U4   ║ 11 ║
╚═════╩═════════════╩════╝

EDIT 3:

那里到底做了什么?为什么你需要n

CROSS JOIN整个子查询只是统计表。就这些。如果MySQL具有生成数字序列的功能(例如generate_series或预先填充的数字表,不需要CROSS JOIN.

需要号码表SUBSTRING_INDEX http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_substring-index:

SUBSTRING_INDEX(str,delim,count)

返回字符串 str 中出现 count 次分隔符 delim 之前的子字符串。如果 count 为正数,则返回最终分隔符左侧的所有内容(从左侧算起)。如果 count 为负数,则返回最终分隔符右侧(从右侧计数)的所有内容。 SUBSTRING_INDEX() 在搜索 delim 时执行区分大小写的匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MySql 中提取具有特定模式的子字符串 的相关文章

随机推荐

  • Flask:无法接收 HTML 表单 POST 数据

    这是我的 HTML
  • 从 java.io.IOException 中提取 HTTP 状态代码

    如何 如果有的话 从 a 获取 HTTP 状态代码java io IOException in java 我假设这是关于IOException被一个抛出URLConnection 处理此问题的三种可能性 具体取决于您的限制 1 投射你的UR
  • android 中的子列表 Arraylist

    我想子列出一个数组列表并将其存储在小数组列表中 我正在执行以下操作 但无法在小数组中输入准确的值 请查看我的代码并建议其他方法或告诉我我做错了什么 ArrayList
  • Ruby 救援和重试特定代码块

    我的脚本中有以下代码 begin Loop to create 1000 emails Loop to send 1000 emails rescue Timeout Error gt e retry attempts 1 if retry
  • 单击键盘上的某个键时如何删除 JLabel?

    所以我有一个 GUI 一个 Tile 类和一个方法类 我在 Game 类中创建了四个图块 其中每个图块都包含一个字母和一种颜色 我现在想要创建一种方法 当我单击键盘上的某个键到图块上的特定字母时 它将删除 Tile 我该怎么办呢 我是否在我
  • 谁能告诉我这是什么编码?

    AAAAAAFuAAIAAAZNYWMgT1MAAAAAAAAAAAAAAAAAAAAAAAAAAADMrsHTSCsAAAALuG8NYWxleHN1Y2tzLmRpYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  • 替换x个或更多点

    我想要一个干净的解决方案来替换文本中的点 一些标题 对此 一些标题 一些 标题 对此 一些 标题 如何用 3 个点替换每个超过 3 个点的序列 With a regular expression based search and repla
  • 将选定的文本扩展为整个单词

    在 IE 中我可以这样做 var rng document selection createRange rng expand word txt rng text 如何在 IE 之外执行相同的操作 使用 getSelection 选择整个单词
  • PyXML 安装 - 此平台上不存在 memmove

    我尝试使用 pip 安装 pyxml 库 但在安装过程中出现以下错误 extensions expat lib xmlparse c 75 2 error error memmove does not exist on this platf
  • Google 日历 API 服务帐户错误

    我收到这个错误 error errors domain calendar reason forbiddenForServiceAccounts message Service accounts cannot invite attendees
  • 在 JPA/Hibernate NamedQuery 中指定数据库函数

    如何在 JPA Hibernate NamedQuery 中指定数据库函数 奇怪的是 hibernate JQL 无法识别 RIGHT 函数 在不使用子字符串的情况下 hibernate 中是否有一种方法可以在 NamedQuery 中指定
  • 仅接受 IComparable 的 SortedList

    我有一个界面IScriptItem实现IComparable
  • Log4j 配置 - 不同的日志记录到不同的文件

    对于某些人来说 这可能是一个非常简单的问题 但就我个人而言 我发现 Log4j 配置非常困难 并且学习进行脑部手术可能不那么具有挑战性 我正在尝试让多个记录器登录到不同的文件中 这是我的 log4j properties 文件中的内容 Ro
  • Github桌面认证失败

    使用 Windows 10 Github Desktop Git 2 19 1 windows 1 64位 VisualStudio VSTS 背景 设法添加我的计算机中的存储库 但我无法用它做任何事情 我可以访问远程存储库 我之前使用过
  • Magento getUrl 不适用于目录/类别对象?

    我已经能够实例化一个类别对象来检索其名称 但是当我使用getUrl方法它不会返回类别列表页面的 URL 或任何其他内容 上面的代码会产生 HTML 输出 li a href name of sub cat a li 有谁知道我如何从
  • 黑莓 Twitter 集成以发布照片

    我正在开发一个应用程序 用户可以在运行 OS 5 0 的 BlackBerry Storm 和 Torch 系列手机上将照片分享到 Facebook 和 Twitter 对于 Facebook 我使用了草莓项目 但对于 Twitter 我找
  • 如何使用多个 CBCharacteristicProperties 和权限初始化 CBMutableCharacteristic

    我正在创建一个新的 CBMutableCharacteristic 以在我正在制作的蓝牙应用程序中使用 我从教程中得到了一些代码 如下所示 customCharacteristic CBMutableCharacteristic alloc
  • 如何在React项目中添加Service Worker

    我想在我的 React 项目中添加 Service Worker 项目已准备就绪 默认服务似乎不起作用 即使当我尝试导入它时 它也会出现以下错误 尝试导入错误 registerServiceWorker 不包含默认导出 导入为 regist
  • GWT 模块的模块标记中的 rename-to 是什么意思?

    GWT 模块中模块标记的 rename to 属性是什么意思 是可选的吗 它 导致编译器表现得好像模块的名称与长的 完全限定的名称不同 http code google com webtoolkit doc latest DevGuideO
  • 在 MySql 中提取具有特定模式的子字符串

    我有一个文本字段 如下所示 option A sum A g3et B 我想获取里面的文字 没有重复项 获得意义 A B 不可能出现双重like的情况 我知道这是一种在数据库中保存数据的可怕方法 我无法更改数据的保存方式 我只需要从本专栏中