簡體   English   中英

mysql find_in_set字符串開頭

[英]mysql find_in_set string starting with

我需要搜索以逗號分隔值的給定字符串開頭的值。
例,
我的欄中有“ 1_2_3_4_5_6、1_2_3_4_5_8、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)嗎?

如果我正確理解了您(我仍然不確定我是否知道),則可以使用:

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

等等。

但是您應該真正規范化您的表。 這對於良好的查詢很重要,而在性能方面也很重要。

根據@Xatenev的建議,如果您真的只喜歡值和每個匹配行的行,那么它將無法很好地工作,並且會產生大量開銷。 這是我要執行的步驟:

  1. 將所有CSV列拆分為多行(這是黑客和性能殺手,我找到了一些可行的解決方案,但未對其進行測試,請參閱此處 ):偽代碼: SELECT ID, SPLIT(',', column) AS entries FROM table (不工作)
  2. 過濾新的虛擬表以僅選擇與前綴匹配的行( SELECT * FROM virtual_table WHERE find_in_set("1_2_3%, entries) ORDER BY ID
  3. 將匹配entries串聯回每個ID的列表中。 例如SELECT ID, GROUP_CONCAT(entries SEPARATOR ', ') FROM filtered_table GROUP BY ID
  4. 做一點事

未知部分是從多行拆分開始的部分。 有許多可能的解決方案都有其自身的缺點或優點。 請注意,這將始終(無論選擇哪種方法)都會花費很多性能。

其他節點:

在您所處的環境中可能會很冒險,就像我的第一個示例一樣,使每一行都與您的搜索字符串匹配並將其過濾到內存中。 這可能比在MySQL中執行此操作更快。

您可以嘗試使用“ REGEXP”

如果要用subtring匹配數據,請嘗試此操作

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[^,]*,?' ;

我能夠用無正則表達式解決它。 索南的答案也是正確的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM