无法理解 LIKE 运算符语法

Trouble understanding a LIKE operator syntax

我粘贴了一个源代码来提取特定的数据集,但我在理解其中一个位时遇到了问题。这是查询的一部分:

WHERE r LIKE 
((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si')

你能帮我翻译这个 LIKE 运算符的内括号是什么意思吗?非常感谢。

WHERE r LIKE 
((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si')

1. COALESCE(ur.title, '') - coalesce function to give first not null value.
2. || ' ' || - to concat space with CONCAT function output.
3. COALESCE(urd.reviewtext, '') - coalesce function to give first not null value.

COALESCE 如果第一个参数是 NULL.

则采用第二个参数

所以让我通过几种可能性来解决:

  • ur.titleNULLurd.reviewtext'review,那么 (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) 计算为:review ,

  • 如果两者都是 NULL,则 ((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) 的计算结果为 ' ,'

  • ur.titletitleurd.reviewtext'review,那么 (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) 的计算结果是:title review ,

现在,在(COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, ''))(COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, ''))之后没有连接运算符,所以很难猜到这里发生了什么,这是语法错误。

您似乎想与多个值进行比较,但实际情况并非如此。你应该这样写:

LIKE (COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) OR
LIKE '.* coronavirus .*|.* SARS .*' OR
LIKE 'si'

首先,正如我分解的那样,没有任何通配符或任何正则表达式特定部分,因此它按字面意思进行比较。最后一个子句 si 也是如此,所以它只会按字面意思匹配 si

在第二个子句 '.* coronavirus .*|.* SARS .*' 中,有正则表达式特定部分 .*,但在 SQL 正则表达式中不受支持。这意味着通常匹配零个或多个任何字符。您还得到了 | 那里的变化。但是,同样,它不会工作,因为 SQL 不支持完整的正则表达式。

编辑: 看起来 Postgre 运算符 SIMILAIR TO 支持以上正则表达式。

WHERE r LIKE ((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .|. SARS .*', 'si')

WHERE r LIKE ( ( COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')
               ) ,
               '.* coronavirus .*|.* SARS .*',
               'si'
             )

MySQL 和 PostgreSQL 都保证语法错误。

SQL 中的 COALESCE 函数在列 return 上有可能为空值时使用。该函数将 null 更改为所需的替代项。例如:COALESCE(title, '') => 会将任何空数据更改为 ''.

在那种特殊情况下不起作用,因为在许多列上使用了 LIKE 函数。你需要一个 => WHERE x LIKE y 或 x LIKE z