2012-10-08 68 views
2

我有一個表,其中有一些名字與一家領先的空間和一些名字沒有它。搜索名字帶或不帶前導空格

我有一個變量$name,我必須與表中的名稱匹配,這個$name沒有領先的空間。在這種情況下,我應該如何編寫我的查詢?

+4

'LTRIM(名稱)'將刪除空間,那麼你可以匹配'LTRIM(名稱),如「史密斯」' – sashkello

+0

這是令人驚訝的很難找到這個問題重複:) –

+0

是啊。我知道.... – akt

回答

3

修剪上的每個值的前緣和後空間。

SELECT * 
FROM tableName 
WHERE TRIM(colName) = '$name' 

TRIM修剪開頭和結尾
LTRIM裝飾前導空格
RTRIM修剪尾隨空間

+0

我用LTRIM(colname的),而不是裝飾,因爲我只是想刪除前導space.Thank您 – akt

+0

有什麼用'TRIM'的問題呢? :) –

+0

我想,'trim'將刪除所有的空格和一些名字確實有它們之間的間隔所以這就是爲什麼。 – akt

0

我建議使用SELECT * FROM tableName WHERE colName = '$name' Or colName = concat(' ' , '$name') 。主要原因是索引用法:如果在計算列ltrim(colName)上過濾,數據庫引擎不能使用colName上的任何索引。我的建議將允許在colName上使用索引。

+0

這很有趣。 – akt

+0

與john woo給出的答案相比,這個查詢有效多少? – akt

+0

好了,'WHERE TRIM(COLNAME)= $ name''意味着該DB必須評估'TRIM(COLNAME)'的所有行並返回匹配。如果你使用'OR'替代與完全匹配,索引seek會返回得更快(假設有一個索引!)。很難說有多... – Cascader

相關問題