2015-10-06 75 views
0

基本上我想要做的是顛倒column LIKE 'string%'行爲。考慮下表:比較直到列長度的字符串(使用索引)

CREATE TABLE texts (
    id int not null, 
    txt varchar(30) not null, 
    primary key(id), 
    key `txt_idx` (txt) 
) engine=InnoDB; 

INSERT INTO texts VALUES(1, 'abcd'); 

根據B-Tree Index Characteristics下面的查詢將利用txt_idx指數:

SELECT txt FROM texts WHERE txt LIKE 'abc%'; 

現在我想有些不同的行爲。我希望在查詢'abcde'時返回'abcd'行。目前,我已經卡住了與此查詢:

SELECT txt FROM texts WHERE 'abcde' LIKE CONCAT(txt, '%'); 

很明顯(通過解釋確認)它不會使用任何索引,但我的直覺告訴我,它應該能夠對指數高達索引比較特殊的價值值的長度(就像strncmp一樣)。

這個主要原因是我的表中有大量的域條目。在查詢「www.something.example.org」時,我想選擇「example.org」和「something.example.org」(但不是「else.example.org」)。不幸的是,拆分和執行多個查詢或應用OR子句似乎對我而言太慢。

回答

1

我能想到的唯一的事情是將其轉換爲等效IN測試:

WHERE txt IN ('a', 'ab', 'abc', 'abcd', 'abcde') 
+0

我也不會想到,這還可以執行若干好多「或」條款 - 謝謝! – pamelus