重写这个极长的查询

时间:2016-04-29 05:07:45

标签: sql firebird firebird2.5

我在代码中偶然发现了这个宝石:

my $str_rep="lower(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(field,'-',''),'',''),'.',''),'_',''),'+',''),',',''),':',''),';',''),'/',''),'|',''),'\',''),'*',''),'~','')) like lower('%var%')";

我不是DB的专家,但我有预感,可以用更理智的方式重写。可以吗?

3 个答案:

答案 0 :(得分:1)

您将此标记为 Perl ,但它可能不是?

无论如何,这是一个Perl解决方案:

$var =~ s/[\-\.\_\+\,\:\;\/\|\\\*\~]+//g;

答案 1 :(得分:1)

这取决于您使用的DBMS。我将发布一些示例(随意编辑此答案以添加更多内容)。

的MySQL

真的没什么可做的;替换所有字符的唯一方法是嵌套REPLACE函数,因为它已在您的代码中完成。

Oracle DB

您的子句可以使用TRANSLATE函数重写。

SQL Server

与MySQL一样,没有任何与Oracle TRANSLATE类似的功能。我在this question的答案中找到了一些(更长的)替代品。但是,一般来说,查询会变得很长。除了拥有一个可以轻松扩展的结构化查询之外,我没有看到这样做的任何真正优势。

火鸟

根据Mark Rotteveel的建议,您可以使用SIMILAR TO重写整个条款。

如果允许通过Perl构建查询字符串,则还可以对包含所有特殊字符的数组使用for循环。

编辑:抱歉,我没有看到您在标签中标明了数据库。只考虑我答案的最后部分。

答案 2 :(得分:0)

抱歉,我不了解相关语言,但有些事情会浮现在脑海中。

首先,您可以查找替换文本函数,该函数只执行单个字符。许多语言都有它们。有些还基于正则表达式查找和替换。

其次,代码看起来像是试图剥离特定的字符列表。此列表可能不包括所有必要的,这意味着相对较高(对接中的痛苦)维护问题。一个更简单的解决方案可能是将问题反转并询问您想要保留哪些字符?像这样反转有时会产生更简单的解决方案。