我有一个数据库,其中我有几张桌子。我有一个表,其中包含一个包含标签名称和标签ID的列。在某种情况下,我有标签名称,我想要标签名称以输入文本开头的所有标签的标签ID。
问题是当我在数据库中搜索标记名“%”时,它返回该表的所有行。但我只需要那些包含以输入文本开头的标记名称的行(在本例中以“%”符号开头)。
示例:
TagName
-------
abc
%test_tag
def
如果我搜索“%”,结果应为“%test_tag”。
目前,我使用的查询是
SELECT * FROM Tags WHERE TagName like '"+tagName+" %'
如何解决?
答案 0 :(得分:1)
根据建议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注入。使用准备好的陈述。
(我知道这个问题已经过时了,但其他人会谷歌,并且值得回答。)
答案 1 :(得分:0)
%是sql的保留运算符:LIKE %ong%
将获取包含“ong”字符串的行,例如:“Long”。
您必须为“%”字符使用转义大小写。我不知道如何逃脱%字符,但我确定你可以通过简短的谷歌搜索找到它。
答案 2 :(得分:0)
来自the accepted answer on other question的想法是使用BETWEEN
关键字来代替查询开始/结束LIKE
的通配符关键字(例如%
和{{ 1}})。
尝试这样的事情:
_
答案 3 :(得分:0)
在这种情况下,您可以使用替换功能:
import { promisify } from "util";
import fs from "fs";
const writeFile = promisify(fs.writeFile);
// this returns a Promise
writeFile("filename.txt", "content");
// which you can put in a try/catch block (in an async method)
// or .then and .catch on it.
writeFile("filename2.txt", "content").then(() => { /* do something after */ });
答案 4 :(得分:-1)
select * from Tags where Tagname like '%"+tagname+"'
这将完成工作