考慮具有名爲name的列的用戶表,該列具有以下三行。SQL查詢是輸入的子字符串的記錄
- 愛麗絲
- 鮑勃
- 卡爾
我想構建一個返回其名稱是輸入的字符串記錄的查詢。例如,如果我查詢Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽車,我不想要匹配。排序的逆轉LIKE
。
可以這樣做嗎?而且可以使用ActiveRecord語法來完成嗎?
考慮具有名爲name的列的用戶表,該列具有以下三行。SQL查詢是輸入的子字符串的記錄
我想構建一個返回其名稱是輸入的字符串記錄的查詢。例如,如果我查詢Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽車,我不想要匹配。排序的逆轉LIKE
。
可以這樣做嗎?而且可以使用ActiveRecord語法來完成嗎?
你可以這樣做(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 + ' %';
使用ActiveRecord IN
expressi於:
Client.where(:name => query.split(" "))
此代碼會產生這樣的SQL:
SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']);
我編輯了我的問題,使其更清晰。分割空間並進行IN是不夠的。鮑比必須回來鮑勃。 – 2013-05-13 02:29:21
我想通了語法SQLite的做到這一點。
User.where("? LIKE name || '%'", query)
雙管道顯然是在SQLite中連接的必要條件。但是,正如plalx所示,不同的SQL服務器使用不同的方言,這使得我的應用程序數據庫依賴於此查詢。由於最終查詢將包含額外的子句,因此在大多數情況下,將此逆向LIKE
的潛在子集限制爲少於10條記錄,因此我將取消這些記錄並在應用程序級別執行匹配。
謝謝你,答案比我預想的要簡單得多。 – 2013-05-13 02:38:58