当前位置: 首页 > 知识库问答 >
问题:

忽略DB2 SELECT语句中的某些字符

景正文
2023-03-14

在将文本搜索构建到网站时,我将通过PHP循环传递它:

$queryList=explode(' ', $queryString);
foreach ($queryList as $queryParm) {
    foreach ($fields as $key => $query) {
        $whereStr.=($key == 0) ? " AND (ucase($query) LIKE ?" : " OR ucase($query) LIKE ?";
        $db->parms[]="%$queryParm%";
        if ($key+1 == count($fields)) $whereStr.=")";
    }
}

这将分隔查询的单词,并使每个单词成为单独的参数。我正在构建一个只允许字母数字加空格的正则表达式,但现在的问题是我需要SQL来匹配这个正则表达式,例如,如果有一个名为“FakeCo's Unicorn Rejectionant#123”的项,那么搜索“fakecos Unicorn Rejectionant 123”应该会得到结果,忽略“'”和“#”存在的事实。事实上,由于名单的结构,“123 fakeco”也应该显示结果。

有没有办法将正则表达式应用于DB2语句?

这是针对DB2 for i(版本7.1)运行的

编辑:尝试解决方案(在上面提到的PHP之前插入),一些字符导致了问题

$sqlNeedsEscape=array("?", "'");
$ignoreChars="'\"?~!@#$%^&*()-=+[]{}|<>,./\\";
$ignoreChars=str_split($ignoreChars);
$whereBefore='';
$whereAfter='';
foreach ($ignoreChars as &$ic) {
    if (in_array($ic, $sqlNeedsEscape)) $ic="'$ic";
    error_log($ic);
    $whereBefore.="replace(";
    $whereAfter.=",'$ic','')";
}

然后将$where Str.=行更改为:

$whereStr.=($key == 0) ? " AND (ucase(trim($whereBefore $query $whereAfter)) LIKE ?" : " OR $whereBefore ucase(trim($query)) $whereAfter LIKE ?";

实际上,每个字段都是replace(replace(replace)(replace(query),!,,,,,@,,,,,,,)替换的,只需围绕该字段再包装几个替换即可。当我看到它对性能的影响时,我就不再追求这个想法了。我将与我们的RPG开发人员讨论Buck Calabro建议的UDF解决方案。这似乎是唯一可能的“真正”解决方案。

共有3个答案

奚瑾瑜
2023-03-14

由于您正在处理IBM版本7.1,IMO的最佳解决方案是加载DB2OmnifindText Search Server(5733-OMF)产品...

简而言之,Omnifind提供“高速语言文本搜索”;所以,搜索鼠标不仅可以找到任何包含鼠标的东西,还可以找到任何包含鼠标的东西。

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=/rzash/rzashkickoff.htm http://www-304.ibm.com/partnerworld/wps/servlet/ContentHandler/whitepaper/i/omnifind/search

这是一个免费的许可产品。请注意,它也适用于6.1。

除了提供CONTAINS()函数外,还有一个SCORE()函数,允许您对搜索结果进行排名。

在6.1之前,IBM提供了一种收费产品,称为(DB2Extender)文本搜索引擎(5770-DE1),它具有许多相同的功能,但使用起来不太方便。

HTH

查尔斯

季华茂
2023-03-14

正如@JamesA所指出的,从7.1开始,WHERE子句中不支持正则表达式。这并不意味着有人没有编写用户定义的函数来实现它。Dennis Lovelady在中端网络邮件列表中分享了他的想法http://archive.midrange.com/midrange-l/201209/msg00810.html它是用RPG编写的,所以您需要让一位IBMi程序员为您加载它。因为这是一个UDF,数据库优化人员不能使用索引,所以以这种方式完成的查询性能不如预期。

池恩
2023-03-14

DB2 for i like谓词不支持正则表达式。

 类似资料:
  • 我正在制作一个不和谐机器人来跟踪在语音频道上花费的时间,但我想知道我是如何做到的,它不计算在某个频道上的成员的时间,比如afk频道。 这是我现在正在使用的事件

  • 项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现 项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时

  • 我想知道是否可以使用此方法忽略字段,因为我有一个要忽略的字段列表,在同一个类中,那么我该如何做呢? 我正在使用 谢谢

  • 我有Solr 5.3.1,需要查询除某些字段之外的所有字段(我需要在某些字段中搜索而不是以这种方式检索字段[/?q=query&fl=field1,field2,field3]) 2.[以下解决方案有效,但需要更多时间] 3.我在data-config.xml中设置了indexed=“false”,它只忽略此字段中的搜索,但是当我搜索所有字段http://localhost:8983/solr/t

  • 我有我的OAuth服务器和客户端,它是由Oauth2授权的。 现在,如果我需要呼叫我的服务,我需要: > 使用以下API从服务器生成访问令牌: < code > localhost:9191/oauth/token?grant _ type =密码 其给出如下响应: 现在我正在传递访问令牌,以运行客户端服务,如下所示: 我需要跳过控制器的身份验证。我该怎么做?有人能帮忙吗 我的WebSecurit

  • 问题内容: 我的脚本很长,我希望能够在需要时仅运行整个文件,而不用担心它的某些部分是否已经运行。但是下面的脚本给我带来了问题。由于某些原因,即使列’EntityID’和’EntityType’不存在,它也将通过IF语句,在这种情况下,它不应通过IF语句。有人可以告诉我怎么了吗? 表的脚本 错误: 问题答案: 马丁绝对是有东西的。里面的东西是由在分析时解析器处理,而忽略你是否会做成。这是您不能执行的

  • 问题内容: 我们的许多模块都始于: …这是整个文件中唯一的Pyflakes警告: 我如何让Pyflakes忽略这一点? (通常我会去阅读文档,但是链接断开了。如果没有人回答,我只会阅读源代码。) 问题答案: 如果您可以改用flake8-包裹pyflakes和pep8 checker-则以 (其中的空间显著-代码的结束和2米之间的空间之一,它和之间,文本)将告诉检查忽略该行的任何错误。

  • 问题内容: 我收到此错误,因为其中一位用户在他的帖子中添加了 错误:[$ sanitize:badparse]清理程序无法解析以下html块:<3 我写的代码 我想他要采取仅标签和标签 那可能吗? 谢谢! 问题答案: 您可以创建过滤器,以清理HTML。 我在其中使用了strip_tags函数 http://phpjs.org/functions/strip_tags/ 控制器: 视图: http: