在子查询中转义%符号

时间:2011-08-24 20:20:38

标签: mysql escaping subquery special-characters

我在mySQL中有一个查询,它意味着返回我们网站上使用的搜索词。是的,这是一个标签云,是的,我知道它是一个m鱼:)

我们有一个管理页面,管理员可以在其中查看搜索字词,并选择将其排除在云端显示。这些单词进入“badWords”表。我们已经得到了一些像“foo%2525252525252520bar”这样的术语,但是我们在排除这些术语时遇到了麻烦。

在伪代码中,获取云搜索条件的查询是:

SELECT * FROM `searchTerms` WHERE `word` NOT IN ( SELECT `word` FROM `badWords` )

这样可以正常工作,除非从子查询返回的其中一个术语中包含%。有没有办法逃脱整个子查询?我试过做了

replace( SELECT `word` FROM `badWords`, '%', '\%' )

...但这显然在语法上不正确。

如果需要,我可以做两个查询,但想知道是否有办法按原样完成。

谢谢!

==============================

更新:现在关闭它,因为我认为错误在其他地方。一旦我知道肯定会报告回来,但是如果这不是正确的问题,请不要浪费时间回答这里的问题......

对迄今收到的两份回复进行了上调。谢谢,伙计们。

==============================

更新2:叹息没关系......无法关闭它:\

==============================

最终更新:好吧,看起来逃避价值不是问题。管理页面在将URL添加到badWords表之前传递URL中的值。在通过URL传递值时,它会发生变化。所以添加到badWords的实际上是“foo%25252525252520bar”(少了一个“25”序列)。如果我手动更新badWords中的值并添加缺少的“25”,它将按预期工作。所以不需要更换或逃脱任何东西。我只需要正确修复这些URL值。

==============================

2 个答案:

答案 0 :(得分:3)

我认为%不是你的问题。我认为您尝试在子查询本身(REPLACE())上使用SELECT ...,而不是在列值(word)上使用SELECT * FROM `searchTerms` WHERE `word` NOT IN ( SELECT REPLACE(`word`, '%', '\%') AS word FROM `badWords` ); 。试试这个:

{{1}}
祝你好运!

答案 1 :(得分:2)

我对MySQL语法不是很了解,但SQL Server允许你这样做:

SELECT * FROM `searchTerms` WHERE `word` NOT IN ( SELECT REPLACE(`word`, '%', '\%') FROM `badWords` ) 

注意:基本上我所做的就是将REPLACE移到某些地方=)希望这会有所帮助。