oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

Posted

技术标签:

【中文标题】oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本【英文标题】:oracle sql - select statement with multiple "case when" and check for contains textoracle sql - 选择具有多个“case when”的语句并检查是否包含文本 【发布时间】:2016-11-13 01:14:26 【问题描述】:

我寻找一个工作示例,我可以在 case 语句中使用 mutliple 来检查是否包含特定文本: 例如

SELECT 
  ID,
  NAME,
  (SELECT 
      (Case when Contains(Descr,"Test") Then "contains Test" 
        when Contains(Descr, "Other") Then "contains Other"
        Else "No Match" End) From DESCRIPTION
       where item_id = id
  ) as "Match"
  From Item

【问题讨论】:

您的问题到底是什么? Else "No Match" 是无效的 SQL(除非您有一个名为 No Match 的列)。还 contains()` 是一个 Oracle 全文函数,需要与您使用的语法不同的语法。您确定您使用的是 Oracle 吗? 包含运算符似乎不为人所知,我得到一个错误 好的,除了“contains”之外,我还可以使用哪个函数来查找子字符串匹配项? docs.oracle.com/database/121/SQLRF/functions089.htm#SQLRF00651 【参考方案1】:

使用 INSTR 函数代替 Contains

【讨论】:

【参考方案2】:

你可能需要这样的东西:

with Item(id, name, descr) as
(
 select 'id1', 'name1', 'description containing Test' from dual union all
 select 'id2', 'name2', 'description containing Others' from dual union all
 select 'id3', 'name3', 'description containing nothing interesting' from dual
)
SELECT 
    ID,
    NAME,
    descr,
    case
        when instr(Descr, 'Test') != 0 then 'contains Test' 
        when instr(Descr, 'Other')!= 0 then 'contains Other'
        Else 'No Match'
    End as "Match"
From Item

使用INSTR 只是可能的解决方案之一;您可以使用LIKE、regular expressions 等以及编写相同查询的不同方式;我相信这很简单,可以不言自明。

【讨论】:

【参考方案3】:

你可以试试这个:

SELECT 
  1,
  2,
  (SELECT 
      (
      Case 
        when     'contains Test' like  '%Test%'   
                              Then 'contains Test' 
        when     'contains Test' like  '%Other%'  
                              Then 'contains Other'
        Else 'No Match'
      End
      ) From dual
       where 1 = 1
  ) as "Match"
  From dual

你可以使用likefunc

【讨论】:

【参考方案4】:

在 Oracle 中,字符串文字需要用单引号括起来。

要查找子字符串匹配,您可以使用LIKE:

SELECT  ID,
        NAME,
        CASE WHEN Descr LIKE '%Test%'  THEN 'Contains Test'
             WHEN Descr LIKE '%Other%' THEN 'Contains Other'
             ELSE 'No Match'
        END AS Match
FROM    Item i
        LEFT OUTER JOIN
        Description d
        ON i.id = d.item_id

INSTR():

SELECT  ID,
        NAME,
        CASE WHEN INSTR( Descr, 'Test' ) > 0  THEN 'Contains Test'
             WHEN INSTR( Descr, 'Other' ) > 0 THEN 'Contains Other'
             ELSE 'No Match'
        END AS Match
FROM    Item i
        LEFT OUTER JOIN
        Description d
        ON i.id = d.item_id

REGEXP_LIKE():

SELECT  ID,
        NAME,
        CASE WHEN REGEXP_LIKE( Descr, 'Test' )  THEN 'Contains Test'
             WHEN REGEXP_LIKE( Descr, 'Other' ) THEN 'Contains Other'
             ELSE 'No Match'
        END AS Match
FROM    Item i
        LEFT OUTER JOIN
        Description d
        ON i.id = d.item_id

【讨论】:

以上是关于oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本的主要内容,如果未能解决你的问题,请参考以下文章

具有 3 个输出的 Oracle SQL WHERE CASE IN 语句

oracle case的这种写法怎么对应多个值 case x when……

SQL - 使用具有多个 IS NULL、IS NOT NULL 的 CASE 语句

如何从oracle sql中的选择计数中对rownum使用case语句?

SQL CASE isNumeric 具有多个值?

SQL CASE THEN 语句,其中 ID 具有多个值