我想從一個數據庫抓取與NAME =「李四」的記錄。忽略空間 - 一個SQL問題
我想我的查詢也搶「約翰(4米之間的空間)能源部」,「約翰(2位betwewen)能源部」等(至少有一個空格不過)。
我還想說的情況並不重要,所以我也可以通過鍵入 「李四」等
我想從一個數據庫抓取與NAME =「李四」的記錄。忽略空間 - 一個SQL問題
我想我的查詢也搶「約翰(4米之間的空間)能源部」,「約翰(2位betwewen)能源部」等(至少有一個空格不過)。
我還想說的情況並不重要,所以我也可以通過鍵入 「李四」等
試試這個得到「李四」:
SELECT * FROM table WHERE lower(NAME) like 'john%doe%'
使用像使用通配符(例如%)繞過空格,而較低的(orlcase)不區分大小寫。
編輯:
正如評論者指出的,這個解決方案有兩個缺點。
首先:您將使用此查詢選擇「johnny doe」或更糟糕的「john Eldoe」,或者更糟的是,「john Macadoelt」,因此您需要在應用程序端進行額外的篩選。
二:使用功能可能會導致表掃描而不是索引掃描。如果你的dbms支持基於函數的索引,這可以避免。見this Oracle example
在SQL可以使用通配符,那就是站在那兒的其他字符的。例如:
select * from table where name like 'john%doe'
將選擇所有以john開頭並以doe結尾的名稱,無論中間有多少個字符。
This article詳細解釋,並給出了一些選擇。
很棒的回答。 10倍! – user181218 2009-10-29 15:56:35
與已接受的答案一樣,請注意,這也會返回許多您可能並不期待的結果(例如,john mordoe) – mavnn 2009-10-29 16:03:42
如果你的數據庫有替換功能
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'
通配符將匹配零個字符,所以如果你想至少有一個空格,那麼你應該做的
select * from table where lower(name) like 'john %doe'
這也將匹配'John Uberdoe'。 – 2009-10-29 16:59:06
@Jonathan:正式注意 – kurosch 2009-10-29 17:47:12
在Oracle中,你可以這樣做:
SELECT * FROM table
WHERE UPPER(REGEXP_REPLACE(NAME,'(){2,}', ' ') = 'JOHN DOE';
沒有誤報,如「約翰mordoe」等。
在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
如果數據庫已經提供,我會提供一個答案,使用較低的&substringing打破內聯視圖中的名字/姓氏... – 2009-10-29 16:15:48
對不起,「事後「,我知道我們並不總是控制數據流,但是,這是一個典型的情況,即簡單的數據內容規範化(而不是關係數據庫意義上的規範化)將會有用,並且避免所有這些查詢時間都是無稽之談。 – mjv 2009-10-29 16:36:30