1

我有一个如下所示的表格

Col1    Col2    Col3
*         $       *
$         *       *
#         *       $
%         *       *
*         *       $
*         @       $

我想要一个 sql 查询来计算表中存在的星数(*)。

一种选择是以下列方式编写查询。

select ((select count(*) from star_table where col1='*') + 
(select count(*) from star_table where col2='*') +
(select count(*) from star_table where col3='*')) as count from dual.

我想知道是否有另一种编写查询的方法来获得相同的结果。

4

4 回答 4

2
select sum(
             case when col1='*' then 1 else 0 end +
             case when col2='*' then 1 else 0 end +
             case when col3='*' then 1 else 0 end            
       ) 
from star_table;  

更新:如果您的列包含字符长度字符串,您可以:

select sum(3 - length(replace(col1||col2||col3,'*')))
from star_table; 

你问这个:)

于 2013-01-21T10:43:15.763 回答
1

请试试:

SELECT SUM(
    (CASE WHEN Col1='*' THEN 1 ELSE 0 END)+
    (CASE WHEN Col2='*' THEN 1 ELSE 0 END)+
    (CASE WHEN Col3='*' THEN 1 ELSE 0 END)) 
FROM TableName
于 2013-01-21T10:41:51.000 回答
0

这个怎么样?

    select sum(decode(col1,'*',1,0)+decode(col2,'*',1,0)+decode(col3,'*',1,0)) 
    from tab;
于 2013-01-21T11:17:26.703 回答
0

这个怎么样?

SQLFIDDLE MYSQL 演示

select sum(col1='*') + sum(col2='*') + sum(col3='*')
from yourtable

对于 SQL Server,这里是:

select sum(patindex('*',col1)) +
sum(patindex('*',col2)) +
sum(patindex('*',col3))
from stars
;

SQLFIDDLE SQL 服务器演示

结果:

| TOTALSTARS |
--------------
|         10 |

在 Florin 指出之前,我将您的 sql 开发人员误认为是 sql server,这里是Oracle版本:

SQLFIDDLE 演示 ORACLE

select sum(instr('*',col1)) +
sum(instr('*',col2)) +
sum(instr('*',col3)) as TotalStars
from stars
;

结果:

| TOTALSTARS |
--------------
|         10 |
于 2013-01-21T10:45:24.097 回答