2

我需要从字母表的所有字符开始的单词数量,存在于我的数据库中

我尝试了以下查询:

SELECT 
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'A%') as A,
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'B%') AS B,
    ...
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'Z%') AS Z

当我运行查询时,它给了我这个错误:

Incorrect syntax near 'COUNT'.    
Incorrect syntax near the keyword 'AS'.

有趣的是,如果我只询问以“A”开头的单词,查询就可以正常工作

我究竟做错了什么?

编辑

只是为了澄清未来的读者。我希望每个字母进行一次检查的原因是因为字母可以根据用户的语言而有所不同,并且每次生成查询时都会提供

4

4 回答 4

1

用例如下

SELECT COUNT(CASE WHEN word LIKE 'A%' THEN 1 END) AS A
      ,COUNT(CASE WHEN word LIKE 'B%' THEN 1 END) AS B
.........
      ,COUNT(CASE WHEN word LIKE 'Z%' THEN 1 END) AS Z
FROM WORDS
于 2013-10-30T16:31:10.920 回答
1

我建议子串出第一个字符:

select
substring(word,1,1) as firstChar,
count(id)
from...
group by
substring(word,1,1) 

这似乎比 26 次单独检查更容易。

于 2013-10-30T16:38:04.730 回答
1

如果您不介意将结果放在行而不是列中,则应该可以:

SELECT LEFT(word, 1) aChar, count(id) total
FROM words
WHERE word LIKE '[A-Z]%'
GROUP BY LEFT(word, 1)

在这里拉小提琴。

另外,根据您的评论:

我必须进行所有这些检查,因为字母表会根据用户的语言而有所不同

在这里使用正则表达式更有意义,因为您可以参数化正则表达式的值并添加或删除字符,而无需更改查询代码(仅参数)。

于 2013-10-30T17:09:02.380 回答
0

您不需要将COUNT操作与子查询分开,您可以内联进行。

SELECT
    (SELECT COUNT(*) FROM words WHERE word LIKE 'A%') AS A,
    (SELECT COUNT(*) FROM words WHERE word LIKE '%B') AS B,
    (SELECT COUNT(*) FROM words WHERE word LIKE '%C') AS C
于 2013-10-30T16:32:17.523 回答