SQL:查找结束给定字符串的DB条目

时间:2013-07-29 15:48:05

标签: mysql sql

我需要执行SQL请求来提取一些数据。我不确定是否可能,如果是的话,我不知道该怎么做。我相信一个例子可以更好地展示我想做的事情。

让我们假设一个非常简单的表:

--------------------------
| ID | domain            |
--------------------------
| 1  | example.com       |
--------------------------
| 2  | stackoverflow.com |
--------------------------

我想检索domain 结束指定字符串的条目。

如果用户输入为www.example.com,我可以执行哪些请求,以便检索domainexample.com的条目?

字符串www.example.com以字符串example.com结束,这意味着我无法使用% LIKE SQL构造,因为我正在寻找谓词的子字符串。

这是一个潜在的肮脏的解决方法,使其更清晰:

user_input = "www.stackoverflow.com"
for domain in get_all_domains_from_db():
    if user_input.endswith(domain):
        print "It's this one!"

Ps:如果不清楚,请告诉我。

4 个答案:

答案 0 :(得分:1)

通常你这样做:

SELECT * FROM tablename WHERE domain LIKE '%example.com'

我建议你永远获取并迭代数据库中的所有记录。这是一种仅适用于大量数据的技术。始终使用数据库为您进行过滤。

答案 1 :(得分:1)

以下内容如何:

WHERE SUBSTRING_INDEX(domain, '.', -2) = SUBSTRING_INDEX(user_filter, '.', -2)

如果您的domain字段始终只是域名本身(没有任何前缀),那么

WHERE domain = SUBSTRING_INDEX(user_filter, '.', -2)

这种方法从http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

无耻地借用

答案 2 :(得分:1)

您可以沿.分割用户输入,并尝试更短和更短的序列。

一些pythonlike伪代码:

user_input = "www.stackoverflow.com"
split_domain = user_input.split('.')
query = 'SELECT * FROM table WHERE domain = ' + '.'.join(split_domain)
while db_returns_no_rows(query) and split_domain:
    del split_domain[0]
    query = 'SELECT * FROM table WHERE domain = ' + '.'.join(split_domain)

答案 3 :(得分:1)

这将解决您的问题。

select * from table_name where :userParam like CONCAT('%', domain)

:userparam将是“www.example.com”