mysql find \u in \u set字符串以

6vl6ewon  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(476)

我需要在逗号分隔的值中搜索以给定字符串开头的值。
例子,
我的专栏里有“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) ?

k2arahey

k2arahey1#

如果我理解正确(我仍然不确定我是否理解),您可以使用:

SELECT * FROM table WHERE column LIKE '%1_2_3%';

这将为您提供如下列:

1_2_3_4_5_5
1_4_5_, 1_2_3_4_5_, 6_7

等等。
但你真的应该规范你的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中执行更快。

2sbarzqh

2sbarzqh2#

我没用正则表达式就解决了。索纳姆的回答也是正确的。

SELECT * from table WHERE CONCAT(',', columnname, ',') like '%,1_2_3%'
hzbexzde

hzbexzde3#

你可以试试“regexp”
如果要将数据与子字符串匹配,请尝试此操作

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' ;


如果你想精确地开始比赛,请试试这个

SELECT * FROM `table` WHERE `column` REGEXP '[, ]?1_2_3[^,]*,?' AND `column` NOT REGEXP '[^, ]1_2_3[^,]*,?' ;

相关问题