计算varchar中具有特定单词的行数(在postgresql中)

时间:2013-08-24 22:01:51

标签: sql postgresql count

我有一张类似下面的表格:

id | name    |    direction           |
--------------------------------------
1   Jhon       Washington, DC
2   Diego      Miami, Florida
3   Michael    Orlando, Florida
4   Jenny      Olympia, washington
5   Joe        Austin, Texas
6   Barack     Denver, Colorado

我想知道有多少人生活在特定的州:

Washington 2
Florida    2
Texas      1
Colorado   1

我该怎么做? (顺便说一下,这只是一个学术观点的问题) 提前谢谢!

3 个答案:

答案 0 :(得分:1)

Postgres提供函数split_part(),它将通过分隔符分解字符串。你想要第二部分(逗号后面的部分):

select split_part(direction, ', ', 2) as state, count(*)
from t
group by split_part(direction, ', ', 2);

答案 1 :(得分:0)

最初我会从方向字段获取状态。一旦你拥有了它,它就很简单了:

SELECT state, count(*) as total FROM initial_table group by state.

要获得状态,一些依赖于dbms的函数是有用的。这取决于语言。

查询的可能伪代码(给定像MySQL的substring_index这样的函数)将是:

SELECT substring_index(direction,',',-1) as state, count(*) as total 
FROM initial_table group by substring_index(direction,',',-1)

编辑:如上所述,查询应该为华盛顿州返回1.

答案 2 :(得分:0)

我做这样的查询的方法是两步 - 首先,准备你需要的字段,第二,分组或其他计算。这样你就可以遵循DRY原则并且不会重复自己。我认为CTE是最好的工具:

with cte as (
   -- we don't need other fields, only state
   select
       split_part(direction, ', ', 2) as state
   from table1
)
select state, count(*)
from cte
group by state

sql fiddle demo

如果您以这种方式编写查询,将来很容易更改分组字段。

希望有帮助,并记住 - 可读性很重要! :)