我需要在逗号分隔的值中搜索以给定字符串开头的值。 例子, 我的专栏里有“1琰2琰3琰4琰5琰6,1琰2琰3琰6琰5琰8”。我可以使用 select * from table where find_in_set('1_2_3_4_5_6',column) 但是如果给定了字符串的起始部分,如何搜索呢?像这样: select * from table where find_in_set('1_2_3%',column) ?
等等。 但你真的应该规范你的table。这对于良好的查询非常重要,性能方面也很重要。 根据@xatenev的建议,如果您真的只喜欢每个匹配行的值和行,那么这将不会很好地工作,并且会带来很大的开销。我将执行以下步骤: 将所有csv列拆分为多行(这是一个黑客和性能杀手,我找到了一些可行的解决方案,但没有进行测试,请参见此处):伪代码: SELECT ID, SPLIT(',', column) AS entries FROM table (不工作) 筛选新的虚拟表以仅选择与前缀匹配的行( SELECT * FROM virtual_table WHERE find_in_set("1_2_3%, entries) ORDER BY ID ) 连接匹配的 entries 回到每个人的清单中 ID . 例如。 SELECT ID, GROUP_CONCAT(entries SEPARATOR ', ') FROM filtered_table GROUP BY ID 做点什么 未知部分是以拆分为多行的开头。有很多可能的解决方案都有各自的缺点或优点。请注意,这将始终(无论选择哪种方法)会耗费大量性能。 附加节点: 在您的情况下,让每一行都像我的第一个示例一样匹配您的搜索字符串,并在内存中过滤它们可能是一种冒险。这可能比在mysql中执行更快。
3条答案
按热度按时间k2arahey1#
如果我理解正确(我仍然不确定我是否理解),您可以使用:
这将为您提供如下列:
等等。
但你真的应该规范你的table。这对于良好的查询非常重要,性能方面也很重要。
根据@xatenev的建议,如果您真的只喜欢每个匹配行的值和行,那么这将不会很好地工作,并且会带来很大的开销。我将执行以下步骤:
将所有csv列拆分为多行(这是一个黑客和性能杀手,我找到了一些可行的解决方案,但没有进行测试,请参见此处):伪代码:
SELECT ID, SPLIT(',', column) AS entries FROM table
(不工作)筛选新的虚拟表以仅选择与前缀匹配的行(
SELECT * FROM virtual_table WHERE find_in_set("1_2_3%, entries) ORDER BY ID
)连接匹配的
entries
回到每个人的清单中ID
. 例如。SELECT ID, GROUP_CONCAT(entries SEPARATOR ', ') FROM filtered_table GROUP BY ID
做点什么未知部分是以拆分为多行的开头。有很多可能的解决方案都有各自的缺点或优点。请注意,这将始终(无论选择哪种方法)会耗费大量性能。
附加节点:
在您的情况下,让每一行都像我的第一个示例一样匹配您的搜索字符串,并在内存中过滤它们可能是一种冒险。这可能比在mysql中执行更快。
2sbarzqh2#
我没用正则表达式就解决了。索纳姆的回答也是正确的。
hzbexzde3#
你可以试试“regexp”
如果要将数据与子字符串匹配,请尝试此操作
或
如果你想精确地开始比赛,请试试这个