2011-04-14 49 views
1

如何计算大写字母与MySQL查询? 我与在字符串中计数大写字母

COUNT(IF(MATCH(post_text) AGAINST('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'),1,NULL)) 

尝试它的时刻,但这个是给我一个错误说:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U' at line 4 

我想,我不能在吮吸反对的条款不使用列表

那么,有没有办法做到这一点?

+0

尝试:'COUNT(IF(MATCH(POST_TEXT)AGAINST('A,B,C,d, E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'),1,NULL) )' – 2011-04-14 10:21:17

+0

但是这会计算出现'A,B,C [...],Z' – awildturtok 2011-04-14 10:32:55

+0

我认为mysql在进行全文搜索时会忽略短于三个字符的单词(MATCH AGAINST) – knittl 2011-04-14 10:38:58

回答

2

试试这个功能 -

DELIMITER $$ 

CREATE FUNCTION cnt_up_case(str VARCHAR(255)) 
RETURNS VARCHAR(255) 
NOT DETERMINISTIC 
CONTAINS SQL 
BEGIN 

    SET @cnt = 0; 
    SET @len = length(str); 
    SET @i = 1; 

    WHILE @i <= @len 
    DO 
    SET @c = substring(str, @i, 1); 
    IF ascii(@c) > 64 AND ascii(@c) < 91 THEN 
     SET @cnt = @cnt + 1; 
    END IF; 

    SET @i = @i + 1; 
    END WHILE; 

    RETURN @cnt; 
END 
$$ 

DELIMITER ; 

例子:

SET @Param1 = 'AbCdE'; 
SET @ResultValue = cnt_up_case(@Param1); 
SELECT @ResultValue; 
-------------- 
3 
+0

#1418 - 该函数在其声明中没有DETERMINISTIC,NO SQL或READS SQL DATA,并且启用二进制日志记录(您可能*希望使用安全性较低的log_bin_trust_function_creators变量);这将是我想要的东西 – awildturtok 2011-04-14 11:30:53

+0

这些选项是默认的;但他们可以被宣布。我编辑了代码。 – Devart 2011-04-14 11:34:05

+0

#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'NOT DETERMINISTIC CONTAINS SQL RETURNS VARCHAR(255)BEGIN SET @cnt = 0; '在2号线; meh,对于压力感到抱歉 – awildturtok 2011-04-14 17:24:40

0

你错过了人物A之前的第一“,和一个后Z.

+0

谢谢,但它在原始代码中并没有丢失,所以这似乎不是错误 – awildturtok 2011-04-14 10:18:19

+0

啊,好吧,如果没有匹配功能,这将是一个相当困难的解决方案。 – 2011-04-14 10:21:13

0

只是一个想法 - 你跟一开始SELECT语句尝试?

SELECT COUNT(IF(MATCH(post_text) AGAINST('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'),1,NULL)) 
+0

不,这是一个计算即时通讯试图从数字中减去计数,所以它不是一个选择;它有一个sligt更大的上下文,所以我会更新 – awildturtok 2011-04-14 10:30:15

+0

只是想 - 我想你需要做'ABC'[MySQL文档](http://dev.mysql.com/doc/refman/5.1/en/全文布尔。html) – 2011-04-14 11:06:15

0

我有一个想法,但它是非常脏..

您可以从post_text删除大写字母,然后它的长度比作oryginal post_text长度:

COUNT(post_text) - COUNT(REPLACE(REPLACE(REPLACE(REPLACE(post_text, 'D', ''), 'C', ''), 'B', ''), 'A', '')) 

我不知道你是否想使用它,我不想说服你,但它是其中一种可能性。

1

如果你的表中有一列(列名),并具有以下值:

  • AAAAAA
  • AAAAAA
  • AAAAAA

你得到的资本使用下面的查询计数回每值:

SELECT columnname,(length(columnname) - length(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(naam,'Z','') ,'Y','') ,'X','') ,'W','') ,'V','') ,'U','') ,'T','') ,'S','') ,'R','') ,'Q','') ,'P','') ,'O','') ,'M','') ,'M','') ,'L','') ,'K','') ,'J','') ,'I','') ,'H','') ,'G','') ,'F','') ,'E','') ,'D','') ,'C','') ,'B','') ,'A',''))) FROM column