0

我有一个这样的查询(它不能按预期工作)

SELECT 
(CASE 
    WHEN str LIKE '%some_string%' THEN 's'
    WHEN str LIKE '%some_string2%' THEN 's2'
END) as str,
COUNT(*) as num FROM Table WHERE
str LIKE '%some_string%' or
str LIKE '%some_string2%'
group by str

并且表格包含类似的东西

|      str                       |
|------------------------------- |
| "some_string_a;"               |  
| "some_string_b; some_else"     |  
| "some_string_c; some_else"     |  
| "some_else; some_string2a"     |  
| "some_string_c; some_string2b" |  

如何获得如下结果?

|      str      |   num  |
|---------------|--------|
| s             |   4    |
| s2            |   2    |

我目前正在低估,因为当它们实际上包含两者时,第 1、2、3 和 5 行被计为“some_string%”(因此也是“s”)。

4

5 回答 5

1

我更新的答案

SQL小提琴

尝试这个

    CREATE table Table1 (str varchar(50));


    Insert into Table1(str) values('aaa');
    Insert into Table1(str) values('bbb');
    Insert into Table1(str) values('aaaaaaaaaa');
    Insert into Table1(str) values('bbbbbbbbbb');
    Insert into Table1(str) values('aaaaaaaaaaaaaaaa');
    Insert into Table1(str) values('aaabbbbb');
    Insert into Table1(str) values('ccccccccccccccc');


Select str , count(*) from
(
    SELECT 
    (CASE  
    WHEN str LIKE '%bbb%' THEN 's2'
    WHEN str LIKE '%aaa%' THEN 's'     
    END) as str
    FROM Table1 WHERE
    str LIKE '%aaa%' or
    str LIKE '%bbb%'
) as T group by str; -- will count in s2 means in a so s will be 3 and s2 is 3
于 2013-09-13T19:01:39.090 回答
0

使用Postgres,模式的通用解决方案n可能如下所示:

SELECT p.pattern, count((str1 LIKE '%' || p.pattern || '%') OR NULL) AS  ct
FROM  (
   SELECT regexp_split_to_table(str, ';') AS str1
   FROM tbl
   ) x
CROSS  JOIN (
   VALUES ('some_string')
         ,('some_string2')
         -- more?
   ) AS p(pattern)
GROUP  BY p.pattern

结果:

pattern       | ct
--------------+----
some_string   | 6
some_string2  | 2

-> SQLfiddle 演示

  • 假设您想匹配字符串的每个部分,由;. Postgres 函数regexp_split_to_table()以这种方式规范化您的数据。

  • 我还假设您想用任何模式计算每场比赛,而不是在第一次比赛后停止。

一个CASE语句只会产生一个匹配并抑制其余的匹配。所以我假设你想要那个。

相反,我交叉连接到一个VALUES表达式,它提供了你想要的尽可能多的模式。一般使用非常方便。您可以使用表或子查询来提供模式来代替VALUES表达式。

于 2013-09-13T19:56:23.767 回答
0

你可以这样做。

SELECT SUM(IF(str LIKE '%some_string%',1,0)) AS s,
       SUM(IF(str LIKE '%some_string2%',1,0)) AS s2
FROM Table WHERE
str LIKE '%some_string%' or
str LIKE '%some_string2%'
group by str;
于 2013-09-13T19:10:36.873 回答
0

尝试在 CASE 语句中切换条件的顺序。

SELECT 
(CASE 
    WHEN str LIKE '%some_string2%' THEN 's2'
    WHEN str LIKE '%some_string%' THEN 's'
END) as str,
COUNT(*) as num FROM Table WHERE
str LIKE '%some_string%' or
str LIKE '%some_string2%'
group by str
于 2013-09-13T18:59:46.700 回答
0

您想按以下相同的表达式进行分组select

SELECT (CASE WHEN str LIKE '%some_string%' THEN 's'
             WHEN str LIKE '%some_string2%' THEN 's2'
        END) as str,
       COUNT(*) as num
FROM Table
WHERE str LIKE '%some_string%' or
      str LIKE '%some_string2%'
group by (CASE WHEN str LIKE '%some_string%' THEN 's'
               WHEN str LIKE '%some_string2%' THEN 's2'
          END);

一些数据库允许在str中使用列别名 ( ) group by,但不是全部。使用完整表达式或使用子查询(如 Dhaval 所建议)会更安全。但是,我会把它写成:

select str, count(*)
from (select (CASE WHEN str LIKE '%some_string%' THEN 's'
                   WHEN str LIKE '%some_string2%' THEN 's2'
              END) as str
      from table
     ) t
where str is not null
group by str;

您不必重复比较,因为当它也不匹配时str会得到一个值。NULL

于 2013-09-13T19:18:28.707 回答