VARCHARフィールドの文字列の出現回数を数えますか?


175

私はこのようなテーブルを持っています:

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue

私は、それぞれの説明で文字列が発生した回数を返す方法を理解しようとしています。

したがって、「値」が出現する回数をカウントしたい場合、sqlステートメントは次のように返します。

TITLE          |   DESCRIPTION                  |   COUNT
------------------------------------------------------------
test1          |   value blah blah value        |   2
test2          |   value test                   |   1
test3          |   test test test               |   0
test4          |   valuevaluevaluevaluevalue    |   5

これを行う方法はありますか?私はphpを使用したくありません。mysqlを使用してください。


4
以下の応答であなたはそこに行きます。ただし、マルチバイト文字を使用している場合CHAR_LENGTH()LENGTH()、代わりにを使用することを忘れないでください。
inhan

このスレッドはこちらでも
Delickate '11 / 11/02

こんにちは、sqlserverクエリでこれを行うにはどうすればよいですか?
aintno12u

LENGTH([フィールド])-LENGTH(REPLACE([フィールド]、 '[char_to_find]'、 ''))
フェニックス

回答:


343

これでうまくいくはずです:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table> 

55
このソリューションは素晴らしいです。ただし、LENGTH()はマルチバイトに対して安全ではなく、奇妙なエラーが発生する可能性があることに注意してください。代わりにCHAR_LENGTH()を使用してください。)
nico gawenda

1
使用に差がないLENGTH()CHAR_LENGTH()同一のカウントバイト/文字に分割され、一方で。@nicogawenda
MohaMad

3
@chyupa undevalueが含まvalueれているため、カウントする必要があります。完全な単語を数えるだけの場合は、 'value'を検索するか、正規表現を使用するなど、もっと複雑な方法を試す必要があります。
PhoneixS

2
大文字の単語も含まれるテキストを検索すると、間違ったカウントに遭遇することに注意してください(すべての名詞が大文字で書かれているドイツ語のように)。REPLACEは完全一致のみを置き換えます。すべての単語を検討するには、上記の置換を次のように変更する必要があります。LENGTH( REPLACE ( LOWER(description), "value", "") )また、「値」がPHPを使用して常に小文字であることを確認してstrtolower()ください。PS:上記のこの解決策は、独自の小さな検索エンジンを構築し、テキスト内の単語数で結果に重みを付けるのに役立ちました。ありがとう!
カイノアック、2017

2
ROUNDここでは不要です。xn出現する長さの文字列を想定します'valueLENGTH(description) - LENGTH( REPLACE ( description, "value", "") ) 常にあなたn*length("value")に与えます、価値の長さによってダイビングは常に整数を残しnます。
四捨五入

21

@yannisソリューションのもう少し簡単で効果的なバリエーション:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 

違いは、「値」の文字列を1文字の短い文字列(この場合は「1234」)に置き換えることです。この方法では、整数値を取得するために除算および丸めを行う必要はありません。

一般化されたバージョン(すべての針ストリングで機能):

SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table> 

1
アイデアを+1しますが、私は一般的に明白な実装を好みます。
not2savvy


12

SQL SERVERでは、これが答えです

Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100))

INSERT INTO @t SELECT 'test1', 'value blah blah value' 
INSERT INTO @t SELECT 'test2','value test' 
INSERT INTO @t SELECT 'test3','test test test' 
INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' 


SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') 

FROM @t

結果

TITLE   DESCRIPTION               Count
test1   value blah blah value        2
test2   value test                   1
test3   test test test               0
test4   valuevaluevaluevaluevalue    5

MySQLをインストールしていませんが、REPLACEが同じであるにもかかわらず、LENの相当物がLENGTHであることがわかりました。

したがって、MySqlの同等のクエリは次のようになります。

SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>

MySqlでもうまくいったかどうか教えてください。


3

これを行う関数を次に示します。

CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  BEGIN
    RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle));
  END;

1
SELECT 
id,
jsondata,    
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "sonal", "") ) 
    ) / LENGTH("sonal")        
)
+
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "khunt", "") ) 
    ) / LENGTH("khunt")        
)
AS count1    FROM test ORDER BY count1 DESC LIMIT 0, 2

Yannis氏に感謝します。あなたのソリューションは私にとってうまくいきました。ここでは、順序と制限のある複数のキーワードに対して同じソリューションを共有しています。


1

これは、スペース手法を使用したmysql関数です(mysql 5.0 + 5.5でテスト済み): CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.