2017-08-10 66 views
0

这是tableMYSQL使用REGEXP

ID | Amount 
---|--- 
0 | 1,2,3 
1 | 11,12,13 
2 | 21,23 
3 | 2,3 

细胞可以有任意数量的由逗号分隔的任何数字。我需要选择其中包含金额的行。由于MYSQL REGEXP不支持lookaheads/lookbehinds,所以我需要一个合适的regex表达式来实现这一点。如果有更有效的解决方案而不是正则表达式,我愿意接受建议。

实现这一目标的一个小白方式是

SELECT * FROM table WHERE 
(Amount LIKE '2' OR Amount LIKE '%,2' OR Amount LIKE '2,%' OR Amount LIKE '%,2,%) 

,但我宁愿避免这种情况。

回答

1

你可以只使用FIND_IN_SET()这里:

SELECT * 
FROM table 
WHERE FIND_IN_SET('2', Amount) > 0 

FIND_IN_SET()搜索的第一个参数的CSV列表作为第二个参数。它处理了试图通过逗号查找数据的混乱情况。话虽如此,你通常应该避免在表格中使用CSV,这是因为它使查询变得困难并且性能不理想。最好将你的表格标准化,并将每一笔金额记录在与给定的ID相关联的单独记录中。

输出:

enter image description here

演示在这里:

Rextester

+0

这是伟大的!当我使用分隔的Amount值设计表格时,我没有意识到使用FIND_IN_SET()让我的生活变得如此简单。感谢您指出!所以,你所说的是,有可能有10-15倍大的表更有效率,但具有唯一的金额值,而不是在单个单元中排列金额?鉴于表中有成千上万的行,这将工作得更快 - FIND_IN_SET()或4 LIKE查询在我的问题? – Aydin4ik