[英]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.