2012-10-05 29 views
1

我的一個表有一個名爲MembersList的字段,它是以分號(;)分隔的LASTNAME/FIRSTNAME.MIDDLENAMEorMIDDLEINITIAL格式的名稱列表。例如:MySql,使用LIKE找到一個確切的字符串

DOE/JOHN.PETER;SMITH/ANDREW.K;FORD/HENRY.GEORGE

現在一個單獨的記錄可能包含名稱DOE/JOHN.P,但此人可能不會像DOE/JOHN.PETER在上面的例子中,他的P可能代表保羅或菲利普相同,但用戶我們的服務簡單地輸入了DOE/JOHN.P

如果我說

SELECT * FROM Events WHERE MembersList LIKE '%DOE/JOHN.P%' 

我將獲得DOE/JOHN.P備案以及爲DOE/JOHN.PETER記錄這不是我想要的。在這種情況下的DOE/JOHN.P應該被視爲他的中間首字母實際上是P並且只有P.我已經嘗試刪除第二個%,但它什麼也沒有返回。我的LIKE應該是什麼樣子?

這是否合理?

+0

你不應該使用'='呢?如'MembersList ='DOE/JOHN.P''? – CKKiller

+0

不,因爲它是用分號分隔的,不只是一個名字 – PaulG

回答

2

你需要測試四個條件:

SELECT * FROM Events 
WHERE MembersList = 'DOE/JOHN.P' 
WHERE MembersList LIKE 'DOE/JOHN.P;%' 
WHERE MembersList LIKE '%;DOE/JOHN.P' 
WHERE MembersList LIKE '%;DOE/JOHN.P;%' 

另外,如果有字符串中沒有逗號,你可以肯定,你可以使用FIND_IN_SET

SELECT * FROM Events 
WHERE FIND_IN_SET('DOE/JOHN.P', REPLACE(MembersList, ';', ',')) 

不幸的是,FIND_IN_SET只能用逗號分隔的列表,所以你必須在使用它之前把分號翻譯成逗號。

所有這些解決方案都將變得緩慢。如果您可以將成員維護在一個單獨的表中(正確標準化),那麼會更好,並且只在需要時才建立以分號分隔的列表。

+0

謝謝,我從所提供的答案中嘗試的所有方法中,您的FIND_IN_SET之一似乎是最快的(在我的情況下反正) – PaulG

1

你可以使用正則表達式,而不是等以檢查,如果名稱以分號結束,或者如果字符串是在結束

SELECT * FROM Events WHERE MembersList REGEXP 'DOE/JOHN\.P(;|$)' 
+0

謝謝,雖然由於某種原因,它有點慢 – PaulG

2
SELECT * 
FROM Events 
WHERE MembersList = 'DOE/JOHN.P' 
    or MembersList LIKE 'DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P' 
0

%是通配符。所以,如果你把它在字符串的結尾(Doe/John.P%),它會找到什麼,如果您使用的LIKE(%..%)語法和要區分後P.

http://www.w3resource.com/sql/wildcards-like-operator/wildcards-like-operator.php

因此,與P和任何結束介於:LIKE 'DOE/JOHN.P'LIKE 'DOE/JOHN.PETER'您不能在P之後放置通配符,因爲它會接收字符串中包含DOE/JOHN.P的任何內容。

%DOE/JOHN.P%將拿起兩個.P.PETER

%DOE/JOHN.P將拿起任何p


結束你可以將它們組合成一個or statment:

LIKE ... OR LIKE....和既要找到兩者。

我建議使用=來代替。

2

這裏有一個辦法:

SELECT * FROM Events WHERE CONCAT(';',MembersList,';') LIKE '%;DOE/JOHN.P;%' 

這裏的竅門是,我們正在尋找的分號分隔符,而我們添加了開頭和結尾的分隔符,以我們正在搜索的字符串。

或者,您可以避免添加前導和尾隨分隔符,並在四種情況下進行測試。作爲字符串中的字符串中的一箇中間元素,字符串中的第一個元素,字符串中的最後一個元素,唯一元素:

LIKE '%;foo;%' 
LIKE 'foo;%' 
LIKE '%;foo' 
LIKE 'foo' 
相關問題