Сравнить несколько критериев текста с текстовым полем в одном запросе? - PullRequest
1 голос
/ 25 октября 2019

У меня есть список из нескольких текстовых критериев, которые мне нужно использовать для подсчета случаев совпадения текста в базе данных с оператором LIKE.

Как мне написать запрос, который будет выполнять сравнение со всеми критериямисразу и вернуть сводный список подсчетов по каждому из этих критериев?

Я начал с простого запроса, который я хотел бы повторить, используя цикл while. Но, к сожалению, я не имею права создавать таблицу, которая будет содержать критерии, на которые нужно ссылаться в каждом цикле, поэтому я должен подготовить запрос для каждого критерия отдельно.

SELECT sum(X), sum(Y), Z
FROM table
WHERE text LIKE 'criteria sample'
WHERE A = nnnnnn
AND B > 0
Group by Z

Чтобы избежать запуска и записинесколько запросов, как я могу загрузить все критерии в один запрос, чтобы выполнить их с контентом, чтобы получить результаты быстрее?

Ответы [ 4 ]

2 голосов
/ 25 октября 2019

Вы можете построить таблицу в запросе с вашими значениями:

SELECT v.comparison, sum(t.X), sum(t.Y), t.Z
FROM table t JOIN
     (VALUES ('criteria sample'),
             ('criteria sample 2'),
             . . .   -- whatever the values are
     ) v(comparison)
     ON t.text LIKE v.comparison
WHERE t.A = nnnnnn AND t.B > 0
GROUP BY v.comparison, t.Z;
1 голос
/ 26 октября 2019

Я думаю, что это должно работать так, если я правильно понимаю.

select t.z,
   sum(case when text like '%firstcriteria%' then 1 else 0 end) as countfirstcriteria,
   sum(case when text like '%secondcriteria%' then 1 else 0 end) as countsecondcriteria
from table t
where A = 'nnnnnn'
   AND B > 0
group by t.z
1 голос
/ 25 октября 2019

Если вам нужна каждая подходящая строка, вы можете просто сказать WHERE text LIKE '%foo%' OR text LIKE '%bar%'. Однако, если я понимаю ваш вопрос, вам нужно количество строк, соответствующих '%foo%', и отдельное количество строк, соответствующих '%bar%'. Это означает, что SUM s и GROUP BY должны выполняться отдельно для каждого текста критерия.

Одно из возможных решений - написать все запросы отдельно, а затем union их в конце. Обратите внимание, что union требует, чтобы у каждого столбца было имя. Вам также понадобится строка статического идентификатора в каждом подзапросе, чтобы вы могли определить, какие критерии были выполнены. Таким образом, у вас будет что-то вроде:

SELECT sum(X) AS sumx, sum(Y) AS sumy, Z, 'foo' AS criteria FROM table WHERE text LIKE '%foo%' AND A = nnnnnn AND B > 0 Group by Z
UNION
SELECT sum(X) AS sumx, sum(Y) AS sumy, Z, 'bar' AS criteria FROM table WHERE text LIKE '%bar%' AND A = nnnnnn AND B > 0 Group by Z
UNION
...(etc)...
0 голосов
/ 25 октября 2019

Like должно следовать за символом%, чтобы слово, которое вы ищете, было захвачено, даже если есть слова до или после него. Я также удалил лишние WHERE

SELECT sum(X), sum(Y), Z
FROM table
WHERE text LIKE '%criteria sample%'
AND A = 'nnnnnn'
AND B > 0
Group by Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...