Mysql 理解类运算符语法有困难
我粘贴了一个源代码来提取一个特定的数据集,但我在理解其中一个位时遇到了问题。以下是查询的一部分:Mysql 理解类运算符语法有困难,mysql,sql,postgresql,sql-like,coalesce,Mysql,Sql,Postgresql,Sql Like,Coalesce,我粘贴了一个源代码来提取一个特定的数据集,但我在理解其中一个位时遇到了问题。以下是查询的一部分: WHERE r LIKE ((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si') 你能帮我翻译一下这个操作符的内括号是什么意思吗?非常感谢。如果第一个参数为NULL,则COALESCE接受第二个参数 WHERE r LIKE ((COALESC
WHERE r LIKE
((COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')) ,'.* coronavirus .*|.* SARS .*', 'si')
你能帮我翻译一下这个
操作符的内括号是什么意思吗?非常感谢。如果第一个参数为NULL
,则COALESCE
接受第二个参数
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.
因此,让我来讨论两种可能性:
ur.title
为NULL
,urd.reviewtext
为'review
,然后(COALESCE(ur.title.)| | | | | | COALESCE(urd.reviewtext.))
计算为:review,
- 如果两者都为空
,((COALESCE(ur.title),| | | | | | COALESCE(urd.reviewtext),)
计算为“,”
ur.title
是title
,urd.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不支持完整正则表达式,因此它无法工作
EDIT:它看起来像Postgre操作符类似于
对上述正则表达式的支持
式中r-LIKE((COALESCE(ur.title),)| | | | | | | | | | | | | | | | | | COALESCE(urd.reviewtext),),,'.*冠
MySQL和PostgreSQL中都保证存在语法错误。当列上可能返回空值时,将使用SQL中的COALESCE函数。该函数将空值更改为所需的替代值。例如:COALESCE(title“”)=>将所有空数据更改为“”
在这种情况下,LIKE函数不起作用,因为LIKE函数正在许多列上使用。你需要一个=>WHERE x LIKE y或x LIKE zMySQL或Postgres?这是我老板发来的,我不确定他在哪里键入的查询,但我很确定它是PostgreSQL或Snowflake。你为什么不请老板澄清一下?你害怕吗?我很抱歉我现在正在问,但我远程工作,他在伦敦,我在新加坡,所以有一个延迟。哈哈。谢谢你非常详细和建设性的回应!是的,我理解COALESCE和双竖条对concat的第一点用法。但对我来说,他试图从该规范中找到什么仍然是一个谜。基本上我是一个我试图找出数据库中提到冠状病毒的任何评论。所以,我猜,“*冠状病毒。*|。*SARS.*”意味着评论中有任何这样的词。但是,是的,我仍然感到困惑。再次感谢!@pascahasanudin最好只使用
columnName,如“%coronavirus%”或columnName,如“%SARS%”
,%
表示任意字符的任意数量:)您甚至可以使用LOCATE
函数(如果它是MySQL),它将返回搜索字符串的索引,如果找不到,它将返回-1(在postgre中,它是strpos
)。如果我的回答对你有帮助,你应该接受它并有选择地投票;)请在您的answe中添加一些解释,以便其他人可以从中学习it@NicoHaase ??? 你想让我从用户手册中复制很多页面吗?这篇文章在综合上是不正确的。在两个数据库管理系统中。如果有人想真正理解什么是不正确的,他会创建最小的表结构,并要求SQL server构建执行计划—服务器会说什么是错误的。例如,没有一个DBMS允许使用三部分结构作为LIKE运算符的参数…我不理解你所说的“保证语法错误”是什么意思-这如何帮助任何人理解你的答案是如何解决(可能不清楚?)问题的?@NicoHaase只理解所写的内容,不要试图在这些词中添加或发现一些隐藏的意思。我保证当使用这个构造时,您将得到一条语法错误消息——仅此而已,仅此而已。保持简单…那么,发布一个产生语法错误的“构造”如何帮助OP理解这个问题呢?为什么不提供一个解决方案来解释什么是错误的以及如何解决?
WHERE r LIKE ( ( COALESCE(ur.title, '') || ' ' || COALESCE(urd.reviewtext, '')
) ,
'.* coronavirus .*|.* SARS .*',
'si'
)