我有一个数据库,我有几张桌子。我有一个表,其中包含一个包含标签名称和标签ID的列。在某种情况下,我有标签名称,我想要标签名称以输入文本开头的所有标签的标签ID。
问题是当我在数据库中搜索标记名“%”时,它返回该表的所有行。但我只需要那些包含以输入文本开头的标记名称的行(在本例中以“%”符号开头)。
例:
TagName
-------
abc
%test_tag
def
如果我搜索“%”,结果应为“%test_tag”。
目前,我正在使用的查询是
SELECT * FROM Tags WHERE TagName like '"+tagName+" %'
怎么解决?
正如here建议的那样,您需要使用ESCAPE关键字。如果它不适合您,请发布您的尝试。我已经成功使用了以下查询,它匹配https://de.wikipedia.org/wiki/%s
:
SELECT * FROM moz_places WHERE url LIKE '%de.wikipedia.org%\%s' ESCAPE '\'
基本上,选择一个转义字符(例如:
),并用%
(或你选择的任何字符)替换:%
的任何实例。如果转义字符本身可以出现在搜索中,请使用带有两个转义字符的转义字符替换每个匹配项。伪代码:
search = '%test'
search = search.replace(':', '::')
search = search.replace('%', ':%')
query = "SELECT * FROM Tags WHERE TagName like '"+search+"%'"
请注意,我在%符号之前删除了一个空格,这可能是问题所在。此外,除非您想要SQL注入,否则不要通过连接字符串来构建SQL查询。使用预备陈述。
(我知道这个问题已经过时了,但其他人会谷歌它并且应该得到答案。)
%是sql的保留运算符:LIKE %ong%
将获取包含“ong”字符串的行,例如:“Long”。
您必须使用“%”字符的转义大小写。我不知道如何逃脱%字符,但我相信你可以在短的谷歌搜索中找到它。
来自the accepted answer on other question的想法是使用BETWEEN
关键字,用于查询以LIKE
的通配符关键字开头/结尾(例如%
和_
)。
尝试这样的事情:
String query = "SELECT * FROM Tags";
if(tagName.startsWith("%")) {
query += " WHERE TagName BETWEEN " + tagName + " AND " + tagName + "z";
} else {
query += " WHERE TagName LIKE '" + tagName + "%'";
}
你可以在这种情况下使用替换功能:
select *
from Tags where replace(TagName,'%','@')like '@%'
select * from Tags where Tagname like '%"+tagname+"'
这将完成这项工作