2011-04-14 47 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