Sql Oracle:DECODE和WHERE子句

Sql Oracle:DECODE和WHERE子句,sql,oracle,range,decode,Sql,Oracle,Range,Decode,因此,我一直在尝试处理一个优化/创建得不好的数据库。我知道可以在where子句中使用decode,但我想知道在选择中解码后是否有任何方法可以使用where子句中的值。基本上,我有这样一个案子 DECODE(theRow, 'P', 1,'D',2,'T',3, ... (goes on a bit)) AS theRowDecoded 我想在该行可能发送的内容之间选择值(比如说在5到8之间)。我不知道他们为什么不在数据库中的这个列中使用数字(这会使编程变得更合理、更简单),但是,哦,好吧,我必

因此,我一直在尝试处理一个优化/创建得不好的数据库。我知道可以在where子句中使用decode,但我想知道在选择中解码后是否有任何方法可以使用where子句中的值。基本上,我有这样一个案子

DECODE(theRow, 'P', 1,'D',2,'T',3, ... (goes on a bit)) AS theRowDecoded
我想在该行可能发送的内容之间选择值(比如说在5到8之间)。我不知道他们为什么不在数据库中的这个列中使用数字(这会使编程变得更合理、更简单),但是,哦,好吧,我必须用我所拥有的


那么,有没有任何方法可以在何处使用解码后的图像,或者有没有更好的方法来制作一个范围?我知道DECODE只是一个equals,但我希望有一个好的方法来使用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')
虚拟列

最后,将表更改为数字可能更好。你可以把号码改成a。这样,数字列也存在于表中,可以用作任何其他列,不同之处在于,如果更新
theRow
,它会自动更新

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

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


除了虚拟列之外,您还可以添加一个额外的列,并通过触发器使这两个列保持同步。或者,您也可以删除
row
。由于这可能不是那么容易,取决于您的能力和权限,以及使用此数据库的应用程序,您可能会考虑引入一个新列,并使旧列为虚拟列,因此,在软件更新为使用新的数字列的过渡期内,它仍将作为只读传统列提供。

您不能在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')
虚拟列

最后,将表更改为数字可能更好。你可以把号码改成a。这样,数字列也存在于表中,可以用作任何其他列,不同之处在于,如果更新
theRow
,它会自动更新

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

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


除了虚拟列之外,您还可以添加一个额外的列,并通过触发器使这两个列保持同步。或者,您也可以删除
row
。由于这可能不是那么容易,取决于您的能力和权限,以及使用此数据库的应用程序,您可能会考虑引入一个新列,并使旧列为虚拟列,因此,在软件更新为使用新的数字列的过渡期内,它仍将作为只读传统列提供。

您不能在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')
虚拟列

最后,将表更改为数字可能更好。你可以把号码改成a。这样,数字列也存在于表中,可以用作任何其他列,不同之处在于,如果更新
theRow
,它会自动更新

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

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


除了虚拟列之外,您还可以添加一个额外的列,并通过触发器使这两个列保持同步。或者,您也可以删除
row
。由于这可能不是那么容易,取决于您的能力和权限,以及使用此数据库的应用程序,您可能会考虑引入一个新列,并使旧列为虚拟列,因此,在软件更新为使用新的数字列的过渡期内,它仍将作为只读传统列提供。

您不能在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')
虚拟列

最后,将表更改为数字可能更好。你可以把号码改成a。这样,数字列也存在于表中,可以用作任何其他列,不同之处在于,如果更新
theRow
,它会自动更新

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

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

除了虚拟列之外,您还可以添加一个额外的列,并通过触发器使这两个列保持同步。或者,您也可以删除
row
。因为这可能不是那么容易,取决于你的能力和