我正在尝试从具有以下结构的表中进行选择:
MATERIALS
id
shortname
longname
长名称与短名称相同的所有行。
我已经尝试过这里提出的解决方案:Dynamic Like Statement in SQL ,但这对我不起作用。
SELECT * from MATERIALS where longname like (shortname + '%');
在 Oracle 中不起作用。
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
CONCAT()
可能是技术上最正确的。
但是,为了方便起见,ORACLE 确实 有一个与
+
... 等效的运算符
SELECT *
FROM MATERIALS
WHERE longname LIKE (shortname || '%')
可能值得一提的是,上述方法在今天的 Oracle 19c 数据库中对我来说都不起作用。
情况
我创建了一个可以像表一样查询的函数。
(返回自定义数据类型的 PIPELINED 函数)。
在返回(修改的)数据行的循环中,我想从函数调用中获取一个参数并使用 LIKE 来标识正确的数据。
我从硬编码值开始,一切正常。 当我开始以 @MatBailie 和 @ypercube™ 的答案中提到的方式动态分配类似的值时。 都不起作用。
修复
然而,真正有效的是执行以下操作:
localVariable := parameterPassedToFunction||'%';
LIKE''||localVariable
希望对将来的人有所帮助。