SQL 中的动态“LIKE”语句 (Oracle)

问题描述 投票:0回答:3

我正在尝试从具有以下结构的表中进行选择:

MATERIALS 
id
shortname 
longname

长名称与短名称相同的所有行。

我已经尝试过这里提出的解决方案:Dynamic Like Statement in SQL ,但这对我不起作用。

SELECT * from MATERIALS where longname like (shortname + '%');

在 Oracle 中不起作用。

sql oracle
3个回答
13
投票

您可以使用

CONCAT()
功能:

SELECT * 
FROM MATERIALS 
WHERE longname LIKE CONCAT(shortname, '%')

或者甚至更好,标准

|| (double pipe)
运算符:

SELECT * 
FROM MATERIALS 
WHERE longname LIKE (shortname || '%')

Oracle 的

CONCAT()
函数不接受超过 2 个参数,因此人们会使用麻烦的
CONCAT(CONCAT(a, b), c)
,而使用运算符则很简单:
a || b || c


2
投票

CONCAT()
可能是技术上最正确的。

但是,为了方便起见,ORACLE 确实 有一个与

+
...

等效的运算符
SELECT * 
FROM MATERIALS 
WHERE longname LIKE (shortname || '%')

0
投票

可能值得一提的是,上述方法在今天的 Oracle 19c 数据库中对我来说都不起作用。

情况
我创建了一个可以像表一样查询的函数。 (返回自定义数据类型的 PIPELINED 函数)。 在返回(修改的)数据行的循环中,我想从函数调用中获取一个参数并使用 LIKE 来标识正确的数据。

我从硬编码值开始,一切正常。 当我开始以 @MatBailie 和 @ypercube™ 的答案中提到的方式动态分配类似的值时。 都不起作用。

修复
然而,真正有效的是执行以下操作:

  1. 创建一个局部变量来设置参数的值并连接在“%”中(因此最终值是传递的字符串以及 % @ 该字符串的末尾)。该代码是
    localVariable := parameterPassedToFunction||'%';
  2. 在需要 LIKE 的查询中,我使用了以下内容:
    LIKE''||localVariable

希望对将来的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.