Database WHERE子句中的问题(不知道如何处理WHERE子句中DECODE()函数的结果)

Database WHERE子句中的问题(不知道如何处理WHERE子句中DECODE()函数的结果),database,oracle,excel,vba,plsql,Database,Oracle,Excel,Vba,Plsql,我有一个相当简单的PL/SQL查询 (...) DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2) as VALUE (...) 我如何使用上述语句应用WHERE子句,因为当我使用以下语句时: WHERE upper(VALUE) like 'SOMETHING' 它给了我一个空记录集(我绝对肯定有满足这些要求的记录) 我不知道这是否重要,但我使用VBA和CreateObject(“OracleInProcServe

我有一个相当简单的PL/SQL查询

(...)
DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2) as VALUE
(...)
我如何使用上述语句应用WHERE子句,因为当我使用以下语句时:

WHERE upper(VALUE) like 'SOMETHING'
它给了我一个空记录集(我绝对肯定有满足这些要求的记录)


我不知道这是否重要,但我使用VBA和
CreateObject(“OracleInProcServer.XOraSession”)
从Excel工作簿中调用此查询最简单的解决方案是复制和粘贴

WHERE upper(DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2)) like 'SOMETHING'

SOMETHING
不是像
这样的
的好搜索模式。

解码
函数的输出可能是
'-'
表2.column2

此解码相当于:

CASE upper(Table.Column) = 'SOMETHING' THEN '---' ELSE TABLE2.COLUMN2 END
我猜您希望筛选具有
上限(TABLE.Column)=“SOMETHING”
的行,在这种情况下,您将使用:

WHERE upper(VALUE) = '---'

接受的解决方案的问题是,必须写出解码表达式两次。这可能是一个维护问题,因为它可能导致表达式的两个实例在某个点上出现分歧

另一种方法是嵌套查询,以便可以在谓词中直接使用解码结果

SELECT * FROM (
  SELECT DECODE(upper(Table.Column), 'SOMETHING', '---', TABLE2.COLUMN2) as VALUE
    FROM ...
  )
  WHERE UPPER(value) LIKE 'X%'

它成功了:)非常感谢:)“Something”放在这里只是为了让它更具可读性。你可能对这一点是正确的,但是……我是PL/SQL新手,对SQL知之甚少。我只是选择了更简单的解决方案。完全正确,我也想到了。但是对于一个SQL新手来说,这可能有点太多了。不管怎样,你的解决方案是+1。