【问题标题】:What is the purpose of the double tilde (~~) symbol in the below query?以下查询中双波浪号 (~~) 的用途是什么?
【发布时间】:2022-07-04 17:17:07
【问题描述】:

这是第一个表:

Line_Card
0-17
0-10
1-1
0-11
1-1-17
1-1-10
1-1-13
1-1-6
1-1-21

这是第二张表:

Port
0-13-37
1-1-2-40
0-8-29
1-1-4-12
1-1-2-14
0-1-30
0-17-25
1-1-17-62
1-1-1-55

下面的查询应该从连接表的产品中读取:

SELECT Line_Card, Port
FROM Table_1
LEFT JOIN Table_2 ON
Table_1.Column= Table_2.Column
             AND Table_1.Port ~~ LIKE_ESCAPE((Table_2.Line_Card || \'-%\'),\'\\\')
             AND Table_1.Port !~~ LIKE_ESCAPE((Table_2.Line_card || \'-%-%\'),\'\\\');

但是,它在 oracle 上显示了无效的 SQL 字符错误。如果有人也可以给我这个声明的等价物或 Teradata 中的无穷大符号,将不胜感激。

  • 此查询是否来自from PostgreSQL
  • 不,这是甲骨文
  • 它不是 Oracle 的有效语法。那么它是从哪里来的,您的问题真的是关于将 PostgreSQL 查询转换为 Oracle 方言吗? (无论如何,那个链接的问题可能会告诉你 ~~ 的含义。)
  • 好吧,事情是我正在研究别人的代码,并且我理解这是 oracle 并且 ~ 在 oracle 中有目的。问题是我找不到对双无穷大 ~~ 符号的任何引用。
  • 那是因为它在 Oracle 中没有意义。同样,链接说它们是 PostgreSQL 运算符,相当于 LIKE 和 NOT LIKE,所以应该很容易修改。 (而LIKE_ESCAPE() 看起来像是一个用于转义通配符的定制函数——不清楚是否需要复制它。)

标签: sql oracle teradata


【解决方案1】:

我正在研究别人的代码,我的理解是这是 oracle 并且 ~ 在 oracle 中有目的。问题是我找不到对双无穷大 ~~ 符号的任何引用。

那是因为它在 Oracle 中没有任何意义。看起来这段代码来自 PostgreSQL,其中 - as this answer 说:

运算符~~ 等价于LIKE~~* 对应于ILIKE。还有!~~!~~* 运算符分别代表NOT LIKENOT ILIKE所有这些运算符都是 PostgreSQL 特定的。

即使在 PostgreSQL 中,这也意味着您可以将它们替换为 LIKENOT LIKE 等价物;这也适用于甲骨文:

AND Table_1.Port LIKE Table_2.Line_Card || '-%'
AND Table_1.Port NOT LIKE Table_2.Line_card || '-%-%'

LIKE_ESCAPE() 部分似乎是一个定制函数,可以转义通配符。鉴于您在这里似乎没有必要的示例数据。

db<>fiddle

【讨论】:

  • 谢谢亚历克斯,我想我理解这段代码的问题。
猜你喜欢
  • 2011-05-02
  • 2011-05-02
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多