2009-10-29 79 views
1

我想從一個數據庫抓取與NAME =「李四」的記錄。忽略空間 - 一個SQL問題

我想我的查詢也搶「約翰(4米之間的空間)能源部」,「約翰(2位betwewen)能源部」等(至少有一個空格不過)。

我還想說的情況並不重要,所以我也可以通過鍵入 「李四」等

+0

如果數據庫已經提供,我會提供一個答案,使用較低的&substringing打破內聯視圖中的名字/姓氏... – 2009-10-29 16:15:48

+2

對不起,「事後「,我知道我們並不總是控制數據流,但是,這是一個典型的情況,即簡單的數據內容規範化(而不是關係數據庫意義上的規範化)將會有用,並且避免所有這些查詢時間都是無稽之談。 – mjv 2009-10-29 16:36:30

回答

2

試試這個得到「李四」:

SELECT * FROM table WHERE lower(NAME) like 'john%doe%' 

使用像使用通配符(例如%)繞過空格,而較低的(orlcase)不區分大小寫。

編輯:
正如評論者指出的,這個解決方案有兩個缺點。

首先:您將使用此查詢選擇「johnny doe」或更糟糕的「john Eldoe」,或者更糟的是,「john Macadoelt」,因此您需要在應用程序端進行額外的篩選。

二:使用功能可能會導致表掃描而不是索引掃描。如果你的dbms支持基於函數的索引,這可以避免。見this Oracle example

+4

然而,注意,這也會產生類似「johnny doe」或更糟糕的「john Eldoe」或更糟糕的「john Macadoelt」等條目。 – mjv 2009-10-29 15:52:49

+0

在第一個%的任一側添加空格將解決一些提到的問題然而。 – mjv 2009-10-29 15:55:02

+0

@mjv:優秀的一點,可能最好用空字符串替換所有空格,並與'johndoe'比較 – kurosch 2009-10-29 15:57:23

0

在SQL可以使用通配符,那就是站在那兒的其他字符的。例如:

select * from table where name like 'john%doe' 

將選擇所有以john開頭並以doe結尾的名稱,無論中間有多少個字符。

This article詳細解釋,並給出了一些選擇。

+0

很棒的回答。 10倍! – user181218 2009-10-29 15:56:35

+1

與已接受的答案一樣,請注意,這也會返回許多您可能並不期待的結果(例如,john mordoe) – mavnn 2009-10-29 16:03:42

2

如果你的數據庫有替換功能

Select * From Table 
Where Upper(Replace(name, ' ', '')) = 'JOHNDOE' 

這些其餘部分將返回行,其中約翰和李四之間的中間部分是什麼,而不僅僅是空間...

如果你的數據庫已經離開功能和反向,嘗試要麼

Select * From Table 
Where left(Upper(name), 4) = 'JOHN' 
    And Left(Reverse(Upper(name), 3)) = 'EOD' 

其他使用串和反向

Select * From Table 
Where substring(Upper(name), 4) = 'JOHN' 
    And substring(Reverse(Upper(name), 3)) = 'EOD' 

或Like運算

Select * From Table 
Where Upper(name) Like 'JOHN%DOE' 
0

通配符將匹配零個字符,所以如果你想至少有一個空格,那麼你應該做的

select * from table where lower(name) like 'john %doe' 
+0

這也將匹配'John Uberdoe'。 – 2009-10-29 16:59:06

+0

@Jonathan:正式注意 – kurosch 2009-10-29 17:47:12

0

在Oracle中,你可以這樣做:

SELECT * FROM table 
WHERE UPPER(REGEXP_REPLACE(NAME,'(){2,}', ' ') = 'JOHN DOE'; 

沒有誤報,如「約翰mordoe」等。

1

在MySQL:

select user_name from users where lower(trim(user_name)) regexp 'john[[:blank:]]+doe' = 1; 

說明:

在上述情況下的USER_NAME正則表達式約翰(一個或多個空格)能源部匹配。比較是不區分大小寫的,修剪會在字符串之前和之後處理空格。

如果搜索字符串包含特殊字符,他們需要轉義。在mysql文檔中的更多:http://dev.mysql.com/doc/refman/5.5/en/regexp.html