如何更正此MySQL查询中的除法结果?

时间:2019-07-16 10:34:01

标签: mysql database replace mysql-workbench integer-division

我有这张桌子:

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)。

3 个答案:

答案 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';