所以我的问题非常简单:
我在SQL中有一个列,它是一个以逗号分隔的列表(即cats,dogs,cows,)我需要仅使用sql 来计算其中的项目数(因此无论我的函数是什么(现在让我们称之为fx)都会像这样工作:
SELECT fx(fooCommaDelimColumn) AS listCount FROM table WHERE id=...
Run Code Online (Sandbox Code Playgroud)
我知道那是有缺陷的,但是你明白了(顺便说一句,如果值fooCommaDelimColumn是cats,dogs,cows,,那么listCount应该返回4 ......).
就这些.
zer*_*kms 51
没有内置函数可以计算字符串中子字符串的出现次数,但是您可以计算原始字符串与不带逗号的相同字符串之间的差异:
LENGTH(fooCommaDelimColumn) - LENGTH(REPLACE(fooCommaDelimColumn, ',', ''))
Run Code Online (Sandbox Code Playgroud)
zerkms的解决方案有效,毫无疑问.但正如Steve Wellens指出的那样,你的问题是由不正确的数据库架构造成的.您不应该在一列中拥有多个值,因为它违反了第一个正常法则.相反,你应该至少制作两个表.例如,假设你有拥有动物的成员:
table member (member_id, member_name)
table member_animal (member_id, animal_name)
Run Code Online (Sandbox Code Playgroud)
更好的是:由于许多用户可以使用相同类型的动物,因此您应该创建3个表:
table member (member_id, member_name)
table animal (animal_id, animal_name)
table member_animal (member_id, animal_id)
Run Code Online (Sandbox Code Playgroud)
您可以像这样填充表格,例如:
member (1, 'Tomas')
member (2, 'Vincent')
animal (1, 'cat')
animal (2, 'dog')
animal (3, 'turtle')
member_animal (1, 1)
member_animal (1, 3)
member_animal (2, 2)
member_animal (2, 3)
Run Code Online (Sandbox Code Playgroud)
并且,为了回答您的初始问题,如果您想知道每个用户有多少动物,您就会这样做:
SELECT member_id, COUNT(*) AS num_animals
FROM member
INNER JOIN member_animal
USING (member_id)
INNER JOIN animal
USING (animal_id)
GROUP BY member_id;
Run Code Online (Sandbox Code Playgroud)
小智 5
遵循@zerkms的建议。
如果您不知道是否有尾部逗号,请使用TRIM函数删除任何尾部逗号:
(
LENGTH(TRIM(BOTH ',' FROM fooCommaDelimColumn))
- LENGTH(REPLACE(TRIM(BOTH ',' FROM fooCommaDelimColumn), ',', ''))
+ 1
) as count
Run Code Online (Sandbox Code Playgroud)
参考:http : //dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim
我也同意,重构表是最好的选择,但是如果现在无法做到这一点,那么此片段可以完成工作。