使用带输入的解码作为逗号分隔列表

时间:2017-01-13 02:42:02

标签: sql oracle oracle11g

对于专家来说,这可能是一个简单的问题。

这是我的要求。我必须使用DECODE并匹配包含逗号分隔值的字符串。

以下是示例SQL:'A'是表中的列值,'A,B'C'是逗号分隔的字符串,作为表达式传递给sql

SELECT DECODE('A' , 'A,B,C', 'true', 'false') FROM DUAL;

上面的SQL应该返回true,因为csv表达式包含'A'

请帮我写这个SQL

3 个答案:

答案 0 :(得分:1)

首先,不要使用decode()。使用ANSI标准CASE语句。您的问题的答案是您可以使用LIKE

SELECT (CASE WHEN ',' || 'A,B,C' || ',' LIKE '%,' || 'A' || ',%'           
             THEN 'true' ELSE 'false'
        END)
FROM DUAL;

注意:字符串连接只是因为我怀疑值是变量。更简单的形式是:

SELECT (CASE WHEN ',A,B,C,' LIKE '%,A,%'           
             THEN 'true' ELSE 'false'
        END)
FROM DUAL;

答案 1 :(得分:0)

如果我理解你的问题,你是想确定一个字符串是否在另一个字符串中?

select case when instr( 'A,B,C', 'A' ) > 0 
         then 'True' 
         else 'False' 
       end 
from dual

添加DECODE版本

  select decode( instr( 'A,B,C', 'A' ), 0, 'False', 'True' )
  from dual

答案 2 :(得分:0)

使用DECODE,您可以这样做:

SELECT DECODE(INSTR('A,B,C', 'A'), 0, 'false', 'true') FROM DUAL;

,其中 如果列值不在逗号分隔的字符串中,INSTR('Comma separated string', 'column value to match')将返回0。在你的例子中, INSTR('A,B,C', 'A')将返回大于0的值,INSTR('D,B,C', 'A')将返回0.因此,DECODE可以检查INSTR()的返回值是否为0然后返回false,否则返回true。