问题描述
这个where子句有什么问题?
我已经创建了一个函数来测试字符串中的关键字。这个函数看起来很简单。传递一个字符串,如果字符串中存在关键字,则返回true,否则返回false。我从v $ reserved_words中获取关键字 (我的测试用例使用my_reserved_words)。问题似乎在我的where条款中。
现在,我们假设使用像 '''%' | | 关键字 | | '%''' 将匹配字符串中关键字的给定实例。我试过使用 '''%' | | 关键字 | | '%''' 和 '''%' | | ''' | | 关键字 | | ''' | | '%'''。如果我检查
create or replace function fReserved(sString IN VARCHAR2) RETURN BOOLEAN IS iCnt INTEGER; -- this is a count of the number of rows returned. BEGIN SELECT count(*) INTO iCnt FROM my_reserved_words WHERE UPPER(sString) LIKE '''%'||'''||keyword ||'''||'%'''; -- if iCnt > 0 then we matched a reserved word in the string -- return true, otherwise return false. IF iCnt > 0 THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END fReserved;
我已经创建了一个函数来测试字符串中的关键字。这个函数看起来很简单。传递一个字符串,如果字符串中存在关键字,则返回true,否则返回false。我从v $ reserved_words中获取关键字 (我的测试用例使用my_reserved_words)。问题似乎在我的where条款中。
现在,我们假设使用像 '''%' | | 关键字 | | '%''' 将匹配字符串中关键字的给定实例。我试过使用 '''%' | | 关键字 | | '%''' 和 '''%' | | ''' | | 关键字 | | ''' | | '%'''。如果我检查
select '''%'||'SELECT'||'%''' from dual;我得到 “% SELECT %”,我认为它会起作用。
专家解答
嗨,罗伯,
好的,这里有一些零碎的东西。
1) 你在引号上走得太过分了 :-) 字符串:
''' % '| | ''' | | 关键字 | | ''' | |' % '''
实际上返回一个 * 静态 * 字符串,即
2) 空值
所以我纠正了这一点:
其中UPPER(sString) 像 '%' | | 关键字 | | '%';
但这仍然可能会让你有些悲伤,因为空值,例如
所以这意味着 * 每个 * 字符串你传递将得到一个 “命中”,因为它将尝试匹配:
'%' | | null | | '%'
这是一场真正的比赛。
3) 数据质量
“BLAH” 为我返回了一个匹配项…… 我认为这很奇怪,直到我查看v $ reserved_words中的数据为止。
是的 .... “A” 是一个保留字!因此,BLAH “包含” 一个保留字,就像任何其他包含a :-) 或E的单词一样 :-)
因此,您可能需要对算法进行一些修改,例如,设置最小长度等。
希望这有所帮助。
好的,这里有一些零碎的东西。
1) 你在引号上走得太过分了 :-) 字符串:
''' % '| | ''' | | 关键字 | | ''' | |' % '''
实际上返回一个 * 静态 * 字符串,即
SQL> select ''' % '| | ''' | | 关键字 | | ''' | |' % ''' from my_reserved_words; '''%'||'''||KEYWOR ------------------ '%'||keyword ||'%' '%'||keyword ||'%' '%'||keyword ||'%' '%'||keyword ||'%'
2) 空值
所以我纠正了这一点:
其中UPPER(sString) 像 '%' | | 关键字 | | '%';
但这仍然可能会让你有些悲伤,因为空值,例如
SQL> create table my_reserved_words as select keyword from v$reserved_words; Table created. SQL> select * from my_reserved_words where keyword is null; KEYWORD ------------------------------------------------------------------------------ 2 rows selected.
所以这意味着 * 每个 * 字符串你传递将得到一个 “命中”,因为它将尝试匹配:
'%' | | null | | '%'
这是一场真正的比赛。
3) 数据质量
“BLAH” 为我返回了一个匹配项…… 我认为这很奇怪,直到我查看v $ reserved_words中的数据为止。
SQL> select * from my_reserved_words where length(keyword) = 1; KEYWORD ------------------------------------------------------------------ + } M E & $ ^ | / . , < A P ) @ ... ... ...
是的 .... “A” 是一个保留字!因此,BLAH “包含” 一个保留字,就像任何其他包含a :-) 或E的单词一样 :-)
因此,您可能需要对算法进行一些修改,例如,设置最小长度等。
希望这有所帮助。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




