![](/img/trans.png)
[英]Count the number of multiple words occurrences within a text field in mysql
[英]SQL count number of words in field
我想做一个 SQL 查询,条件是 column1 包含三个或更多单词。 有什么办法吗?
也许尝试计算空间?
SELECT *
FROM table
WHERE (LENGTH(column1) - LENGTH(replace(column1, ' ', ''))) > 1
并假设单词是空格数+ 1
如果你想要一个列包含三个或更多单词的条件, 并且你希望它在一堆数据库中工作, 并且我们假设单词由单个空格分隔,那么你可以使用like
:
where column1 like '% % %'
在Postgres中,你可以使用regexp_split_to_array()
:
select *
from the_table
where array_length(regexp_split_to_array(the_column, '\s+'), 1) >= 3;
这会将列the_column
的内容the_column
为数组元素。 使用一个或多个空格作为分隔符。 但它不会尊重“引用”空格。 值'one "two three" four'
将被计为四个字。
这样做的最好方法是不要这样做。
相反,您应该使用应用程序层在INSERT期间对单词进行计数,并将单词计数保存到其自己的列中。
虽然我喜欢并赞成这里的一些答案,但所有这些答案都会非常缓慢而且不是100%准确。
我知道人们想要一个简单的答案来选择单词计数,但它的准确性和速度都是不可能的。
如果您希望它100%准确,并且速度非常快,那么请使用此解决方案。
要解决的步骤:
ALTER TABLE tablename ADD COLUMN wordcount INT UNSIGNED NULL, ADD INDEX idxtablename_count (wordcount ASC);
。 $count = str_word_count($somevalue);
wordcount
包含$count
的值,如insert into tablename (col1, col2, col3, wordcount) values (val1, val2, val3, $count);
然后你的选择语句变得超级简单,干净,超快,并且100%准确。
select * from tablename where wordcount >= 3;
还要记住,当您更新任何行时,您需要重新计算该列的单词。
使用 ClickHouse DB,您可以使用 splitByWhitespace() function。
这可以工作:
SUM(LENGTH(a) - LENGTH(REPLACE(a, ' ', '')) + 1)
其中a
是字符串列。 它将计算空格数,比单词数少1。
对于“n”或更多的单词
select *
from table
where (length(column)- length(replace(column, " ", "")) + 1) >= n
PS:如果单词之间有多个空格,则无效。
要处理多个空格,请使用此处显示的方法
Declare @s varchar(100)
set @s=' See how many words this has '
set @s=ltrim(rtrim(@s))
while charindex(' ',@s)>0
Begin
set @s=replace(@s,' ',' ')
end
select len(@s)-len(replace(@s,' ',''))+1 as word_count
https://exploresql.com/2018/07/31/how-to-count-number-of-words-in-a-sentence/
我认为大卫在上面钉了它。 但是,作为一个更完整的答案:
LENGTH(RTRIM(LTRIM(REPLACE(column1,' ', ' ')))) - LENGTH(REPLACE(RTRIM(LTRIM(REPLACE(column1, ' ', ' '))), ' ', '')) + 1 AS number_of_words
这将删除双重空格,以及字符串中的前导和尾随空格。
当然,您可以通过连续添加超过2个空格的替换来进一步...
其他答案似乎都没有考虑到多个空格。 例如,很多人在句子之间使用两个空格; 这些空格计数器会计算每个句子的额外单词。 "Also, scenarios such as spaces around a hyphen - like that. "
就我的目的而言,这要准确得多:
SELECT
LENGTH(REGEXP_REPLACE(myText, '[ \n\t\|\-]{1,}',' ')) -
LENGTH(REGEXP_REPLACE(myText, '[ \n\t\|\-]{1,}', '')) wordCount FROM myTable;
它计算任何一组1 个或多个连续字符: [ space
, linefeed
, tab
, pipe
, or hyphen
] 并将其计为一个单词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.