选择值匹配-SQL

选择值匹配-SQL,sql,oracle,substring,Sql,Oracle,Substring,您是否可以建议为查询中的多个子字符串选择一个计数 因此,如果我有一个消息字段,其中包含例如文本消息,我可以 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|消

您是否可以建议为查询中的多个子字符串选择一个计数

因此,如果我有一个消息字段,其中包含例如文本消息,我可以

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|消息体
1 |你好吗?
2|嗨,非常感谢
3 |你好,情况怎么样?
4 |再见

需要输出:

你好,2
再见,1

选择(输入字符串),计数(1) 从桌子上
其中(“%hello%”、“%ciao%”)中的(输入字符串)

如果我理解正确,您可以尝试以下方法:

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\u LIKE()

编辑:您可以使用包含您感兴趣的所有字符串的派生表,并左键连接到原始表进行计数:

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

以下是寻找整句话的步骤:

  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

STRING
从何而来?我不知道,假设他知道自己在做什么(他在select中使用了它)嗨,谢谢你提供的信息-有没有办法让“select”中的字符串值就是我在Where子句中输入的字符串,它统计每次出现的次数?首先你必须帮助我更好地理解你。发布数据样本和预期输出,因为我真的不明白您在尝试做什么。您好,我刚刚更新了帖子以尝试更清楚一点:)
  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