将多个文本条件与单个查询中的文本字段进行比较?

时间:2019-10-25 04:09:17

标签: sql sql-server

我有一个包含多个文本条件的列表,我需要使用这些条件来计算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 个答案:

答案 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%'的行数。这意味着对于每个标准文本,必须分别运行SUMGROUP 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