暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 当通配符应用于列时,在where子句中使用like。

askTom 2017-07-07
291

问题描述

这个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) 你在引号上走得太过分了 :-) 字符串:

''' % '| | ''' | | 关键字 | | ''' | |' % '''

实际上返回一个 * 静态 * 字符串,即

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论