2010-01-11 31 views
1

我有以下SQL查詢:使SQL請求更有效和整齊?

SELECT Phrases.* 
FROM Phrases 
WHERE (((Phrases.phrase) Like "*ing aids*") 
    AND ((Phrases.phrase) Not Like "*getting*") 
    AND ((Phrases.phrase) Not Like "*contracting*")) 
    AND ((Phrases.phrase) Not Like "*preventing*"); //(etc.) 

現在,如果我是使用正則表達式,我可能會幫所有的窮人變成一個大(讓|承包|阻止),但我不知道該怎麼辦這在SQL中。

有沒有辦法讓這個查詢更清晰/優雅?

+1

您使用的數據庫是? – 2010-01-11 15:37:07

+0

哪種味道的RDBMS?因爲其中一些支持RegEx(例如Oracle 10g +)。儘管RegEx可能會相當複雜。 – APC 2010-01-11 15:37:15

+2

我懷疑,通過合併正則表達式,你可以使它更有效率。除此之外,並非每個DBMS都支持它們,那麼您使用哪種? – Tomalak 2010-01-11 15:37:34

回答

4

只需通過刪除冗餘的東西,並使用一致的命名約定您的SQL看起來方式冷卻器:

SELECT * 
FROM phrases 
WHERE phrase  LIKE '%ing aids%' 
    AND phrase NOT LIKE '%getting%' 
    AND phrase NOT LIKE '%contracting%' 
    AND phrase NOT LIKE '%preventing%' 

請您談一下正則表達式。一些DBMS確實有它:MySQL,Oracle ......但是,選擇任何一種語法都應該考慮查詢的執行計劃:「它有多快」而不是「多好看」。

+0

我並不是在尋找性能 - 我在固定數據集上運行手寫查詢,嘗試刪除不相關的數據 - 因爲我正在尋找一種簡單的方法來添加更多和更多的改進,直到找到信息我需要。 因此,在上面的例子中,我不斷添加另一個我想保持結果的動名詞,並且認爲也許還有比添加整行更有效的方法。 – Jono 2010-01-11 15:47:34

+0

好吧,它不像一個正則表達式,但它在Access中工作。謝謝。 – Jono 2010-01-11 15:56:58

0

根據您使用的SQL服務器,它可能支持REGEX本身。例如,谷歌搜索顯示,SQL Server,Oracle和MySQL都支持正則表達式。

1

的MySQL,你可以使用regular expression where-clause parameters

SELECT something FROM table WHERE column REGEXP 'regexp' 

所以,如果這是你使用的是什麼,你可以寫一個正則表達式字符串,它可能是一個更緊湊一點,你的4個like標準。但是,查詢查詢爲其他人做什麼可能並不容易。

它看起來像SQL Server offers a similar feature

1

SINEC這聽起來像你正在構建這個,你去挖掘你的數據,這裏的東西,你可以考慮:

CREATE TABLE Includes (phrase VARCHAR(50) NOT NULL) 
CREATE TABLE Excludes (phrase VARCHAR(50) NOT NULL) 

INSERT INTO Includes VALUES ('%ing aids%') 
INSERT INTO Excludes VALUES ('%getting%') 
INSERT INTO Excludes VALUES ('%contracting%') 
INSERT INTO Excludes VALUES ('%preventing%') 

SELECT 
    * 
FROM 
    Phrases P 
WHERE 
    EXISTS (SELECT * FROM Includes I WHERE P.phrase LIKE I.phrase) AND 
    NOT EXISTS (SELECT * FROM Excludes E WHERE P.phrase LIKE E.phrase) 

你那麼永遠只是運行相同的查詢,你可以簡單地改變什麼在「包含」和「排除」表中優化您的搜索。

+0

這是一個有趣的方法。我猜SQL的數組變量沒有簡單的解決方案,但是,在那裏。 – Jono 2010-01-13 07:25:32

+0

嗯。 我真的開始喜歡這個。 – Jono 2010-01-13 10:17:22

+0

好吧,試圖實現這一點,我發現一個問題 - 我不能在那裏做任何ORs。所以我不能結合的東西。例如,找到'藝術'和('學校'或'學位'),但不是'部分'。 – Jono 2010-01-13 10:22:48

0

您可以將所有否定標準推送到短路CASE表達式(使用Sql Server,不確定MSAccess)。

SELECT * 
FROM phrases 
WHERE phrase LIKE '%ing aids%' 
    AND CASE 
    WHEN phrase LIKE '%getting%' THEN 2 
    WHEN phrase LIKE '%contracting%' THEN 2 
    WHEN phrase LIKE '%preventing%' THEN 2 
    ELSE 1 
    END = 1 

在「更高效」的一面,您需要找到一些標準,讓您避免閱讀整個短語列。雙面通配符標準不好。右側通配符標準很好。

+0

Jet/ACE/Access不支持CASE,所以此答案無用,應該刪除。 – 2011-02-12 00:01:52