2008-09-16 145 views
2

我在與當前使用SQL查詢 - 僅在沒有完全匹配時才使用Like?

LEFT JOIN weblog_data AS pwd 
    ON (pwd.field_id_41 != '' 
    AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

但是我發現,我就只需要使用,如果沒有精確匹配第一查詢的問題。發生什麼事是因爲使用了LIKE這個查詢是雙重傾斜的,所以如果它首先測試一個完全匹配,那麼它將避免雙重傾斜問題。任何人都可以提供任何進一步的指導嗎?

回答

1

聽起來好像你想要加入表中的別名爲pwd和ewd的表格,首先根據完全匹配,然後如果失敗了,那麼就像現在的類似比較。

試試這個:

LEFT JOIN weblog_data AS pwd1 ON (pwd.field_id_41 != '' AND pwd.field_id_41 = ewd.field_id_32) 
LEFT JOIN weblog_data AS pwd2 ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

然後,在你的SELECT子句,使用這樣的:

select 
    isnull(pwd1.field, pwd2.field) 

但是,如果你正在處理一個字段,可在PWD空,即將導致問題,但應該工作,雖然:

select 
    case pwd1.nonnullfield is null then pwd2.field else pwd1.field end 

你還必須確保做一個組,作爲即使最終忽略數據,連接到pwd2仍會將行添加到結果集中。

1

你說的是短路評估。

看看這篇文章它可以幫助你:使用TSQL http://beingmarkcohen.com/?p=62

+0

我不明白這是如何實現我在找什麼。從這些示例看,它看起來像是SQL足夠聰明,可以避免無意義查詢的額外週期。這看起來像是如果A或B,並且A是真的,那麼它繼續前進。我需要它做A,如果A失敗了,做B。 – 2008-09-16 19:22:03

1

,運行精確匹配,檢查行== 0的NUM如果是這樣,運行等等,否則不要運行類似或在精確匹配下添加類似結果。

0

我只能想到在代碼中做它。查找完全匹配,如果結果爲空,請查找LIKE。 另一個選項是WHERE({從精確匹配計數} = 0)在此查詢中的WHERE,在這種情況下,如果完全匹配返回的結果多於0,則不會與LIKE進行比較。但其效率極低......更不用說在代碼中有意義地使用它是相當困難的事實。

我會去找一個If(從精確匹配計數= 0)然後像查詢一樣,否則就使用精確匹配的結果。