在没有LIKE的情况下检查Oracle中字符串中的子字符串

Ric*_*nop 15 sql oracle

如何在不使用LIKE的情况下检查Oracle中字符串中的子字符串?假设我要从表中选择姓氏中包含字母"z"的所有用户:

SELECT * FROM users WHERE last_name LIKE "%z%";
Run Code Online (Sandbox Code Playgroud)

这会有效,但我不想使用LIKE.我可以使用其他功能吗?

wef*_*fwe 15

我猜你问的原因是性能?有instr函数.但这可能会在幕后发挥作用.

也许你可以查看全文搜索.

作为最后的度假村,您将看到缓存或预先计算的列/索引视图.


Dav*_*sta 6

如果您只对'z'感兴趣,则可以创建基于函数的索引.

CREATE INDEX users_z_idx ON users (INSTR(last_name,'z'))
Run Code Online (Sandbox Code Playgroud)

然后你的查询将使用WHERE INSTR(last_name,'z') > 0.

使用此方法,您必须为可能要搜索的每个字符创建单独的索引.我想如果你经常这样做,那么为每个字母创建一个索引可能是值得的.

另外,请记住,如果您的数据的名称以标准方式大写(例如,"Zaxxon"),那么您的示例和我的示例都不会与以Z开头的名称匹配.您可以通过包含LOWER来纠正此问题.搜索表达式: INSTR(LOWER(last_name),'z').

  • 更有效的方法是只使用z索引行... CREATE INDEX users_z_idx ON用户(INSTR(last_name,'z')> 0时的情况,然后是1,否则为null)) (4认同)

dar*_*jnz 5

您可以使用INSTR这样做:

SELECT * FROM users WHERE INSTR(LOWER(last_name), 'z') > 0;
Run Code Online (Sandbox Code Playgroud)

如果子字符串不在字符串中,则INSTR返回零.

出于兴趣,你为什么不想使用?

编辑:我冒昧地使搜索案例不敏感,所以你不要错过Bob Zebidee.:-)