当前位置: 首页 > 面试题库 >

在WHERE子句中使用别名

钱星华
2023-03-14
问题内容

我正在执行以下查询,并为所有列使用别名。我用命名了别名。因为这是必需的。现在,我想直接在where子句中引用别名,我的操作如下所示:

SELECT pt.prod_desc AS"PROD_DESC",
 (
CASE
WHEN pt.prod_level='2'
THEN 'Product'
WHEN pt.prod_level='4'
THEN 'Sub-Product'
WHEN pt.prod_level='5'
THEN 'Service'
ELSE 'N/A'
 END)         AS"PROD_LEVEL",
prod_id      AS "PROD_ID",
isactive     AS "IsActive",
updt_usr_sid AS "UPDT_USR_SID",
updt_ts      AS "UPDT_TS",
(
CASE
WHEN pt.prod_level='5'
THEN parent_prod_id
ELSE NULL
  END) AS ".SUB_PROD_ID",
(
 CASE
  WHEN pt.prod_level='5'
  THEN
  (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id= pt.parent_prod_id
  )
  ELSE 'N/A'
 END ) AS ".SUB_PROD_DESC",
 (
CASE
WHEN pt.prod_level='4'
THEN parent_prod_id
WHEN pt.prod_level='5'
THEN
  (SELECT parent_prod_id
  FROM dims_prod_type A
  WHERE A.prod_id= pt.parent_prod_id
   )
 ELSE NULL
   END) AS ".PRNT_PROD_ID",
(
 CASE
 WHEN pt.prod_level='4'
THEN
   (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id=pt.parent_prod_id
   )
  WHEN pt.prod_level='5'
THEN
   (SELECT prod_desc
   FROM dims_prod_type A
  WHERE A.prod_id IN
    (SELECT B.parent_prod_id
    FROM dims_prod_type B
    WHERE b.prod_id=pt.parent_prod_id
    )
  )
 ELSE 'N/A'
 END)AS ".PRNT_PROD_DESC"
FROM dims_prod_type pt
WHERE pt.".PRNT_PROD_ID" like 'A%';

但是,当我执行此操作时,出现以下错误:

    SQL Error: ORA-00904: "PT".".PRNT_PROD_ID": invalid identifier
     00904. 00000 -  "%s: invalid identifier"

我知道SQL首先执行where子句,因此这就是错误的原因。但是我该如何解决呢?有什么建议吗?


问题答案:

您已经知道不能在where子句中使用别名,但这仅适用于相同级别的SQL。您可以将查询包装在外部查询中:

SELECT *
FROM (
  SELECT pt.prod_desc AS"PROD_DESC",
  ...
   END)AS ".PRNT_PROD_DESC"
  FROM dims_prod_type pt
)
WHERE ".PRNT_PROD_ID" like 'A%';

唯一的选择是重复casewhere子句中生成该列的整个过程,这对于如此复杂的事情将是不愉快的。



 类似资料:
  • 问题内容: 我正在尝试搜索文本和备注的多列,以查找某些我不想看到的特定短语和黑名单短语。 假设下表 前任。我想找到所有提到(在任何领域中)“苹果”但黑名单中的“苹果酱”的故事。 如何在where子句中使用别名?我找不到有关此主题的任何文档: 1)这种方法可行吗? 2)替代方法是否意味着我将在每次行迭代中执行多个字符串连接? 问题答案: 我不能在where子句中使用别名。 这种方法可行吗? 当然,将

  • 问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在

  • 问题内容: 我懂了 “无效的列名daysdiff”。 Maxlogtm是日期时间字段。是让我发疯的小东西。 问题答案: 通常,您不能在子句中引用字段别名。(将其视为包括别名在内的全部内容,在该子句之后应用。) 但是,如其他答案所述,您可以强制将SQL视为在子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作: 括号/子选择: 或参阅亚当的CTE版本答案。

  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。

  • 问题内容: 我需要在WHERE子句中使用别名,但它一直告诉我它的未知列。有什么办法可以解决这个问题?我需要选择评级高于x的记录。评分的计算方法如下: 问题答案: 您可以使用HAVING子句,该子句 可以 看到别名,例如 但是在where子句中,您需要重复您的表达式,例如 但!并非所有的表达式都被允许-使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。 从MySQL手

  • 问题内容: 我想在Derby数据库中模拟以下类型的查询(即Microsoft SQL Server语法)的效果。目标是返回表中存储在“ someColumn”中的日期少于7天的所有记录。这是我希望实现的Microsoft SQL语法… 我已经能够确定在Derby中它将涉及使用timestampdiff函数。但是我不知道Derby中WHERE子句中函数用法的语法,因此我找不到任何示例。我发现了很多在