我有这张桌子:
CREATE TABLE `mytable` (
`id` int(11) NOT NULL,
`value` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
使用此数据:
id, value
--------------------
'1', '__cccccccc; Myword'
'2', '__ddddddd; Myword'
'3', 'OOO; myword; anotherword'
此查询:
SELECT `mytable`.`value`
, LENGTH(`mytable`.`value`) 'string length'
, LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')) 'after replace'
, LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword','')) 'after sub'
, LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword',''))/8 'after divide'
FROM mytable
WHERE LOWER(`mytable`.`value`) LIKE '%; myword%'
OR LOWER(`mytable`.`value`) LIKE '%; myword';
结果如下:
# value, string length, after replace, after sub, after divide
'__cccccccc; Myword', '18', '10', '8', '16.7500'
'__ddddddd; Myword', '17', '9', '8', '15.8750'
'OOO; myword; anotherword', '24', '16', '8', '22.0000'
insert语句:
INSERT INTO `test`.`mytable`
(`id`,
`value`)
VALUES
('1','__cccccccc; Myword'),
('2','__ddddddd; Myword'),
('3','OOO; myword; anotherword');
问题是最后一列结果不正确。例如,第一条记录的最后一列应为8/8,即1。为什么我得到这些结果?如何用最小的变化纠正它们?
注意:我需要使用LOWER将字符串转换为小写,因为replace是区分大小写的,并且我的值是区分大小写的(我需要捕获关键字; myword
的任何出现,无论它包含大写字母还是小写字母,我不在乎。
编辑:
该查询旨在计算字符串; myword
出现的次数。因此,我计算了字段的长度,并用''
替换了我想计数的关键字后,从字段的长度中减去了长度。然后将结果除以关键字字符串中的字符数(在我的情况下为8)。
答案 0 :(得分:0)
问题的根源是REPLACE区分大小写。因此,select语句应为:
SELECT `mytable`.`value`
, LENGTH(`mytable`.`value`) 'string length'
, LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')) 'after replace'
, (LENGTH(`mytable`.`value`) - LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword',''))) 'after sub'
, (LENGTH(`mytable`.`value`) - LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')))/8 'after divide'
FROM mytable
WHERE LOWER(`mytable`.`value`) LIKE '%; myword%'
#OR LOWER(`mytable`.`value`) LIKE '%; myword';
您会看到我在每个LOWER()
中都添加了REPLACE()
,因为REPLACE()区分大小写,并且您搜索的字母都带有小写字母,因此必须将文本转换为小写才能捕获每次出现的关键字,尽管字母大小写。
通过此查询,您将获得以下结果:
# value, string length, after replace, after sub, after divide
'__cccccccc; Myword', '18', '10', '8', '1.0000'
'__ddddddd; Myword', '17', '9', '8', '1.0000'
'OOO; myword; anotherword', '24', '16', '8', '1.0000'
因此最后一列正确显示了value
字段中关键字的出现次数。
答案 1 :(得分:-1)
尝试此功能
delimiter $$
CREATE FUNCTION `count_str`(long_text_column TEXT, string_to_find VARCHAR(32)) RETURNS int(11)
DETERMINISTIC
BEGIN
RETURN ROUND((CHAR_LENGTH(long_text_column) - CHAR_LENGTH(REPLACE(long_text_column, string_to_find, ""))) / CHAR_LENGTH(string_to_find));
END $$
delimiter ;
答案 2 :(得分:-1)
因此,根据您的查询进行拆分,请查看
SELECT `mytable`.`value`
, LENGTH(`mytable`.`value`) 'string length'
, LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')) 'after replace'
, LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword','')) 'after sub'
, (LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword','')))/8 'after divide'
FROM mytable
WHERE LOWER(`mytable`.`value`) LIKE '%; myword%'
OR LOWER(`mytable`.`value`) LIKE '%; myword';