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
你可以使用like
func
【讨论】:
【参考方案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 语句