【问题标题】:How to use variables in psql LIKE query regular expression如何在 psql LIKE 查询正则表达式中使用变量
【发布时间】:2019-01-20 18:24:21
【问题描述】:

我有一个 psql 数据库,其中包含两个要加入查询的表。表1(我们可以称为Articles)有两列:

  • slug - 这是网站中文章路径的名称

    • 示例 1 - 'my-article-1'
    • 示例 2 - 'my-article-2'
  • title - 文章的实际标题

    • 示例 1 - “我的第一篇文章”
    • 示例 2 -“我的第二篇文章”

表 2(我们称之为 Log)有两列,它们共同代表从服务器发回的请求响应:

  • url - 这是GET请求的url路径

    • 示例 1 - '/articles/my-article1'
    • 示例 2 - '/articles/my-article2'
  • status - 从服务器发回的状态码

    • 示例 - '200 OK'

我想返回特定文章被请求并返回“200 OK”状态码的次数。

我的问题: 我想将 Articles.slug 变量与 where 子句中的 Log.url 变量进行匹配,但我不知道如何在正则表达式中使用变量。现在我正在努力将 slug 与路径匹配,这是我目前的代码:

SELECT articles.title, articles.slug, log.path
FROM articles, log
WHERE log.path like '/articles/' + articles.slug
and log.status = '200 OK'

我知道我的 WHERE 子句不正确,这就是我要查找的内容。如何将完整的 log.path 字符串与带有变量articles.slug 的连接字符串匹配。

抱歉,如果其中有任何不清楚或看起来很愚蠢,我是第一次学习 SQL

【问题讨论】:

  • 在您的示例中,您的slug'my-article-1',而您的url(或者是path,这是您的查询使用的?)是'/articles/my-article1'。请注意,数字前有一个破折号,一旦没有。这是她的错字还是真实数据是这样的?这可以解释为什么您的查询不起作用。如果这只是一个错字,那么当您将 + 替换为 Postgres 的字符串连接运算符 || 时,查询实际上应该可以工作。您还应该使用显式连接语法而不是隐式连接语法,您的 LIKE 可以替换为 =
  • 我只是使用 - 将“示例 1”与实际示例分开,它实际上不在我的查询中。查看我的代码示例,了解我是如何实际进行查询的。

标签: sql postgresql sql-like


【解决方案1】:

我想出了一个不能完全回答我的问题的解决方案,但这就是我解决它的方法。

select articles.title, count(*)
from articles, log
where substring(log.path,10,100) = articles.slug
and log.status = '200 OK'
group by articles.title

【讨论】:

  • 您可能想要from articles join log on substring(log.path,10,100) = articles.slug 而不是老式的隐式 JOIN。毕竟,您几乎可以加入任何表达式。
【解决方案2】:

学习使用正确、明确、标准JOIN 语法和ON 子句。您的查询应该看起来更像这样:

SELECT a.title, a.slug, l.path
FROM articles a JOIN
     log l
     ON l.path like '/articles/' || a.slug
WHERE l.status = '200 OK';

|| 是 Postgres 和大多数其他数据库中的连接运算符 -- 因为它是用于字符串连接的 ISO/ANSI 标准运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 2019-11-08
    相关资源
    最近更新 更多