2013-05-13 34 views
1

考慮具有名爲name的列的用戶表,該列具有以下三行。SQL查詢是輸入的子字符串的記錄

  • 愛麗絲
  • 鮑勃
  • 卡爾

我想構建一個返回其名稱是輸入的字符串記錄的查詢。例如,如果我查詢Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽車,我不想要匹配。排序的逆轉LIKE

可以這樣做嗎?而且可以使用ActiveRecord語法來完成嗎?

回答

1

你可以這樣做(SQL Server語法):

SELECT name 
FROM users 
WHERE 'your query' + ' ' LIKE name + ' %'; 

下面將找到愛麗絲:

SELECT name 
FROM users 
WHERE 'Alice Jackson' + ' ' LIKE name + ' %'; 

SELECT name 
FROM users 
WHERE 'Alice' + ' ' LIKE name + ' %'; 

下不會找到愛麗絲:

SELECT name 
FROM users 
WHERE 'Ali' + ' ' LIKE name + ' %'; 
+0

謝謝你,答案比我預想的要簡單得多。 – 2013-05-13 02:38:58

0

使用ActiveRecord IN expressi於:

Client.where(:name => query.split(" ")) 

此代碼會產生這樣的SQL:

SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']); 
+0

我編輯了我的問題,使其更清晰。分割空間並進行IN是不夠的。鮑比必須回來鮑勃。 – 2013-05-13 02:29:21

0

我想通了語法SQLite的做到這一點。

User.where("? LIKE name || '%'", query) 

雙管道顯然是在SQLite中連接的必要條件。但是,正如plalx所示,不同的SQL服務器使用不同的方言,這使得我的應用程序數據庫依賴於此查詢。由於最終查詢將包含額外的子句,因此在大多數情況下,將此逆向LIKE的潛在子集限制爲少於10條記錄,因此我將取消這些記錄並在應用程序級別執行匹配。