2016-06-21 9 views
1

Können Sie raten, ob es möglich ist, eine Zählung für zahlreiche Teil in einer AbfrageWählen Sie einen Wert Spiel - SQL

so zu wählen, wenn ich eine Nachricht Feld haben, die beispielsweise SMS-Nachrichten enthält, und ich konnte tun

SELECT COUNT(1) 
FROM MESSAGES 
WHERE MESSAGE_BODY LIKE '%hello%' 

aber was ich will ist, mehr tun:

SELECT STRING, COUNT(1) 
FROM MESSAGES 
WHERE MESSAGE_BODY IN (list of strings with wild card) 

ist das möglich?

Beispiel:

ID | Message_Body
1 | Hallo wie geht's dir?
2 | Hallo, Vielen Dank
3 | Hallo, wie ist es?
4 | Ciao

Ausgang gesucht:

Hallo, 2
ciao, 1

SELECT (Eingabezeichenfolgen), count (1) FROM TABLE WHERE (Eingabezeichenfolgen) IN ('% Hallo%' , '% ciao%')

Antwort

1

Wenn ich Sie richtig verstanden habe, können Sie so etwas wie dies versuchen:

SELECT t.string, 
     CASE WHEN t.MESSAGE_BODY LIKE '%laptop%' then 1 else 0 END + 
     CASE WHEN t.MESSAGE_BODY LIKE '%one%' then 1 else 0 END + 
     CASE WHEN t.MESSAGE_BODY LIKE '%two%' then 1 else 0 END as count_col 
FROM YourTable t 

Wenn Sie nur mehrere LIKE comaparison möchten, verwenden Sie REGEXP_LIKE():

SELECT STRING, COUNT(1) 
FROM MESSAGES 
where regexp_like(MESSAGE_BODY, 'one|two|laptop') 

EDIT: Sie eine abgeleitete Tabelle, die alle Zeichenketten enthalten können Sie auf Interessent sind und für Zählung der ursprünglichen Tabelle LEFT JOIN:

SELECT t.wrd,COUNT(s.id) as cnt 
FROM (
    SELECT 'hello' as wrd FROM DUAL 
    UNION ALL 
    SELECT 'ciao' as wrd FROM DUAL) t 
LEFT OUTER JOIN messages s 
ON(s.message_body LIKE '%' || t.wrd || '%') 
GROUP BY t.wrd 
Hier
+0

Wo 'STRING' kommen aus? –

+0

Ich weiß nicht, angenommen, er weiß, was er tut (er verwendete es in seiner Auswahl) – sagi

+0

Hallo, Danke für die Info - gibt es einen Weg, so dass in der "Auswahl" der String-Wert ist die Strings, die ich eingeben die Where-Klausel und es zählt jedes Vorkommen? – JRH31

0

ist mit der Suche nach ganzen Wörtern:

SELECT a.word, COUNT (message.message_body) 
    FROM ( SELECT REGEXP_SUBSTR ('hello,ciao', '[^,]+', 1, LEVEL) word 
       FROM DUAL 
      CONNECT BY REGEXP_SUBSTR ('hello,ciao', '[^,]+', 1, LEVEL) IS NOT NULL) a 
     LEFT OUTER JOIN MESSAGES ON REGEXP_INSTR (MESSAGE_BODY, '(^|\s)' || a.word || '(\s|$)', 1, 1, 0, 'i') > 0 
GROUP BY a.word