繁体   English   中英

Oracle:DECODE和WHERE子句

[英]Oracle: DECODE and WHERE Clause

因此,我一直在尝试处理优化/创建效果不佳的数据库。 我知道您可以在where子句中使用解码,但是我想知道是否有任何方法可以在选择中进行解码后在where子句中使用该值。 基本上,我有这样的情况

DECODE(theRow, 'P', 1,'D',2,'T',3, ... (goes on a bit)) AS theRowDecoded

我想在该行可能发送的值之间选择一个值(比如说5到8之间)。 不知道为什么他们不只是在数据库的此列中使用数字(这样可以使编程更有意义,更容易编程),但是,哦,可以使用我所拥有的东西。

那么,有什么方法可以在哪里使用theRowDecoded呢,还是有更好的方法来做范围? 我知道DECODE只是一个等值,但希望有一个很好的方法来进行解码范围。

您不能在where子句中使用别名。 有两种选择。

子查询

使查询成为子查询,并在更高级别上使用别名。

SELECT
  theRowDecoded
FROM
  (SELECT
    DECODE(theRow, .....) as theRowDecoded
  FROM
    theTable)
WHERE
  theRowDecoded BETWEEN 5 AND 8

使用原始值

也许更好,因为使用原始值还将允许在where子句中使用索引。 而且,它更短,没有那么嵌套,因此可以说更具可读性。

SELECT
  DECODE(theRow, .....) as theRowDecoded
FROM
  theTable
WHERE 
  theRow in ('T', 'X', 'Y', 'Z')

虚拟专栏

最后,将表更改为数字可能会更好。 您可以使数字成为function based virtual column 这样,数值列也存在于表中,并且可以用作任何其他列,不同之处在于,如果您更新theRow ,它会自动更新。

我自己没有使用虚拟列,但是它应该像这样工作:

alter table theTable
  add theRowDecoded int as generated always (decode(theRow, .....)) virtual;

实际栏

除了虚拟列,您还可以添加一个额外的列,并使两者与触发器保持同步。 或者,您可以完全删除theRow 由于根据您的能力和权限以及使用该数据库的应用程序,这可能并不容易,因此您可以考虑引入一个新列,并将旧列设置为虚拟列,因此仍然可以使用过渡期间的只读旧列,在该过渡期间,软件将更新为使用新的数字列。

您可以在字段列表中重复相同的表达式。 我不知道是否可以在where子句中使用其别名(必须尝试)。

您不能做的(afaik)是在where子句中为表达式赋予别名,并在其他地方使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM