我有一个包含多个文本条件的列表,我需要使用这些条件来计算LIKE运算符在数据库中匹配文本的出现次数。
如何编写一个查询,该查询将一次与所有条件进行比较并返回每个条件的计数汇总列表?
我从一个简单的查询开始,我想使用while循环对其进行迭代。但是不幸的是,我无权创建一个表,该表将包含每个循环要引用的条件,因此我必须分别为每个条件准备查询。
SELECT sum(X), sum(Y), Z
FROM table
WHERE text LIKE 'criteria sample'
WHERE A = nnnnnn
AND B > 0
Group by Z
为避免运行和编写多个查询,如何将所有条件加载到一个查询中以针对内容运行它们,以便更快地获得结果?
答案 0 :(得分:2)
您可以使用您的值在查询中构造一个表:
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 :(得分:1)
如果您希望每个匹配的行,您只需说WHERE text LIKE '%foo%' OR text LIKE '%bar%'
。但是,如果我理解您的问题,则实际上您需要一个匹配'%foo%'
的行数和一个单独匹配'%bar%'
的行数。这意味着对于每个标准文本,必须分别运行SUM
和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)...
答案 2 :(得分:1)
如果我理解正确,我认为它应该像这样工作。
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
答案 3 :(得分:0)
Like后面应加上%符号,以便即使要查找的单词之前或之后都包含该单词,它也会被捕获。我还删除了多余的WHERE
SELECT sum(X), sum(Y), Z
FROM table
WHERE text LIKE '%criteria sample%'
AND A = 'nnnnnn'
AND B > 0
Group by Z