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

计算varchar中具有特定单词的行数(在postgresql中),sql,postgresql,count,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

我有一个类似于以下的表格:

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
我该怎么做?(顺便说一下,这只是一个带有学术观点的问题)
提前谢谢

最初,我将从方向字段获取状态。一旦你做到了,事情就很简单了:

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。

Postgres提供函数
split\u part()
,该函数将用分隔符分隔字符串。您需要第二部分(逗号后的部分):


我进行此类查询的方法分为两步——第一步,准备所需的字段,第二步,分组或其他计算。这样你就遵循了枯燥的原则,不要重复你自己。我认为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

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


希望有帮助,记住——可读性很重要

对华盛顿来说,这不应该仅仅是1吗?因为Jhon住在DC,而不是华盛顿州。我的例子中没有!(我不是美国人):)另一种看法是:我想数一数有多少个“华盛顿”、“佛罗里达”。。。不管是在后面还是在前面,“这有点难,我认为唯一的方法是使用PL/SQL函数,不是吗?
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