2016-06-21 84 views
1

你可以建议,如果可能的话,在查询中选择众多子计数选择值相匹配 - SQL

,所以如果我有一个包含例如,文本消息的信息栏,然后我可以做

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

但我想要做的是更多:

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

这可能吗?

打破例子:

ID | Message_Body
1 |你好!你好吗?
2 |嗨,非常感谢
3 |你好,事情怎么样?
4 |侨

输出想:

你好,2
侨,1

SELECT(输入字符串),COUNT(1) FROM TABLE WHERE(输入字符串)IN( '%你好%' 'Ciao的%%')

回答

1

如果我理解正确的话,你可以尝试这样的事:

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 

如果你只是想多LIKE comaparison,使用REGEXP_LIKE()

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

编辑:可以使用派生表包含你是intrested所有字符串,并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 
+0

哪里'STRING'从何而来? –

+0

我不知道,假设他知道他在做什么(他在他的选择中使用它) – sagi

+0

嗨,感谢您的信息 - 是否有一种方式,以便在“选择”字符串值是我输入的字符串where子句和它计数每个事件? – JRH31

0

这里是寻找全字:

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