Как использовать переменные в psql LIKE регулярное выражение запроса - PullRequest
0 голосов
/ 20 января 2019

У меня есть база данных psql с двумя таблицами, к которым я хочу присоединиться для запроса. Таблица 1 (мы можем назвать Статьи) имеет две колонки:

  • slug - название пути статьи на веб-сайте

    • пример 1 - 'my-article-1'
    • пример 2 - 'my-article-2'
  • title - актуальное название статьи

    • пример 1 - «Моя первая статья»
    • пример 2 - «Моя вторая статья»

Таблица 2 (мы будем называть Log) имеет два столбца, которые вместе представляют ответы на запросы, отправленные обратно с сервера:

  • url - путь URL, запрошенный GET

    • пример 1 - '/ article / my-article1'
    • пример 2 - '/ article / my-article2'
  • status - это код состояния, отправляемый с сервера

    • пример - '200 OK'

Я хочу вернуть количество раз, когда конкретная статья запрашивалась, и возвращал код состояния «200 OK».

Моя проблема: Я хочу сопоставить переменную Articles.slug с переменной Log.url в моем предложении where, но я не знаю, как использовать переменные в регулярных выражениях. Сейчас я просто работаю над сопоставлением пули с путем, вот мой код:

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 с объединенной строкой с переменной article.slug.

Извините, если что-то неясно или выглядит глупо, я впервые изучаю SQL <3 </p>

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Научитесь использовать правильный, явный, стандартный 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 для конкатенации строк.

0 голосов
/ 20 января 2019

Я нашел решение, которое точно не отвечает на мой вопрос, но вот как я обошел его.

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