2012-08-31 42 views
2

是否有可能在MYSQL做的部分比賽,但相反的方式輪如何,這是正常完成..MYSQL部分匹配....位你怎麼想

IE我有檢查網站.. ..優惠券代碼

用戶鍵入「WUD092050549E」和命中搜索

我希望數據庫返回......與column_x匹配

  • 「WUD092050549E」任意行 - 精確匹配

  • 「WUD0920」 - 7字符匹配

  • 「WUD0」 - 4字符匹配

BUT NOT

  • 「WUD039540」 - 4字符匹配,然後不正確

  • 「123213WUD092050549E2334」 - 不正確的字符,然後匹配

本質其中行匹配4個或更多字符(按相同的順序),沒有失誤

我知道確切的比賽可以通過以下方式實現。「 SELECT * WHERE column_x =「WUD092050549E」

至於我自己,我非常想精確排序匹配,則如果沒有發現其他不太精確匹配(所以兩個查詢可能)

+0

您是否使用Server_Side語言來執行查詢?如果是這樣,通過執行SELECT *操作數據會容易得多。將它放入一個數組中,然後在PHP中使用類似這樣的內容:$ var = substr('WUD039540',0,4);'..這將返回你正在尋找 – Zak

回答

0

怎麼樣:

SELECT 1 from DUAL 
WHERE column_x LIKE 'WUD092050549E%' 
or INSTR('WUD092050549E', column_x) > 0 

你可以檢查出來HERE

+0

謝謝,我編輯了原始帖子,但我認爲instr = 1應該工作...然後使最小搜索長度爲4或更多 – user1639745

+0

不是'= 1',而是'> 0'因爲它可以有任何正值,請檢查[** this **](http://sqlfiddle.com/#!2/d41d8/ 1691)out(請參閱最後一個查詢來自* NOT *節,它返回NULL – alfasin

0

目前尚不清楚的規範是什麼。

如果你想檢查的整場比賽,第7個字符,或前四個字符:

SELECT t.voucher_code='WUD092050549E' AS exact_match 
    , t.* 
    FROM mytable t 
WHERE t.voucher_code = 'WUD092050549E' 
    OR t.voucher_code = LEFT('WUD092050549E',7) 
    OR t.voucher_code = LEFT('WUD092050549E',4) 

如果你想要的任何長度的優惠券代碼匹配,你可以列舉所有可能:

SELECT t.voucher_code = 'WUD092050549E' AS exact_match 
    , t.* 
    FROM mytable t 
WHERE t.voucher_code = 'WUD092050549E' 
    OR t.voucher_code = LEFT('WUD092050549E',11) 
    OR t.voucher_code = LEFT('WUD092050549E',10) 
    OR t.voucher_code = LEFT('WUD092050549E',9) 
    OR t.voucher_code = LEFT('WUD092050549E',8) 
    OR t.voucher_code = LEFT('WUD092050549E',7) 
    OR t.voucher_code = LEFT('WUD092050549E',6) 
    OR t.voucher_code = LEFT('WUD092050549E',5) 
    OR t.voucher_code = LEFT('WUD092050549E',4) 
較慢

,但更簡潔:

SELECT t.voucher_code 
    , t.* 
    FROM mytable t 
WHERE t.voucher_code = LEFT('WUD092050549E',CHAR_LENGTH(t.voucher_code)) 

但我不知道我ü瞭解規格說明,所以這可能與您所尋找的方式不同。