交互式报告查询失败,突出显示行 css 条件

Query for interactive report failing with highlight row css conditions

我正在使用下面的查询根据列值突出显示状态列。 它在 else 块中因错误而失败: ORA-20999: 解析 SQL 查询失败!

ORA-06550:第 12 行,第 15 列:ORA-00923:在预期位置找不到 FROM 关键字

哪里出错了??

似乎 CASE(选择状态)会导致问题,因为

  • 以逗号结尾,后面没有任何内容
  • 您将整个 CASE 结构命名为 "PT_IT_ISSUES"."STATUS",这是一个列名;你应该使用 alias,例如只是 status

像这样:

SELECT "P_IT_ISSUES"."ISSUE_SUMMARY" AS "ISSUE_SUMMARY",
       "P_IT_PEOPLE"."PERSON_NAME" AS "IDENTIFIED_BY",
       "P_IT_ISSUES"."IDENTIFIED_DATE" AS "IDENTIFIED_DATE",
       "P_IT_DEPARTMENTS"."DEPT_NAME" AS "DEPT_NAME",
       DECODE ("P_IT_PEOPLE_1"."PERSON_NAME",
               NULL, 'Unassigned',
               "P_IT_PEOPLE_1"."PERSON_NAME")
          AS "ASSIGNED_TO",
       CASE
          WHEN "P_IT_ISSUES"."STATUS" = 'Open'
          THEN
                '<aaab style= "    color: green; " >'
             || TO_CHAR ("P_IT_ISSUES"."STATUS", '999,999,999,999,999')
             || '</aaab>'
          WHEN "P_IT_ISSUES"."STATUS" = 'On-Hold'
          THEN
                '<aaab style= "    color: red; " >'
             || TO_CHAR ("P_IT_ISSUES"."STATUS", '999,999,999,999,999')
             || '</aaab>'
          ELSE
                '<aaab style= "    color: red; " >'
             || TO_CHAR ("P_IT_ISSUES"."STATUS", '999,999,999,999,999')
             || '</aaab>'
       END AS status                                                   -> this!
  FROM "P_IT_PEOPLE" "P_IT_PEOPLE_1",
       "P_IT_DEPARTMENTS" "P_IT_DEPARTMENTS",
       "P_IT_PEOPLE" "P_IT_PEOPLE",
       "P_IT_ISSUES" "P_IT_ISSUES"
 WHERE     "P_IT_ISSUES"."IDENTIFIED_BY_PERSON_ID" =
              "P_IT_PEOPLE"."PERSON_ID"
       AND "P_IT_ISSUES"."ASSIGNED_TO_PERSON_ID" =
              "P_IT_PEOPLE_1"."PERSON_ID"(+)
       AND "P_IT_ISSUES"."RELATED_DEPT_ID" = "P_IT_DEPARTMENTS"."DEPT_ID"

但是,我会进一步重写该代码并且

  • 引用 table 和列时省略双引号
  • 使用正确的(阅读:更简单)table 别名
  • 删除不必要的列别名
  • 重写 FROM 子句并显式加入 tables

像这样:

SELECT i.issue_summary,
       b.person_name AS identified_by,
       i.identified_date,
       d.dept_name,
       DECODE (a.person_name, NULL, 'Unassigned', a.person_name)
          AS assigned_to,
       CASE
          WHEN i.status = 'Open'
          THEN
                '<aaab style= "    color: green; " >'
             || TO_CHAR (i.status, '999,999,999,999,999')
             || '</aaab>'
          WHEN i.status = 'On-Hold'
          THEN
                '<aaab style= "    color: red; " >'
             || TO_CHAR (i.status, '999,999,999,999,999')
             || '</aaab>'
          ELSE
                '<aaab style= "    color: red; " >'
             || TO_CHAR (i.status, '999,999,999,999,999')
             || '</aaab>'
       END
          AS status
  FROM p_it_issues i
       JOIN p_it_departments d ON i.related_dept_id = d.dept_id
       JOIN p_i_people b ON i.identified_by_person_id = b.person_id
       LEFT JOIN p_it_people a ON a.person_id = i.assigned_to_person_id;

这不是更简单、更易于阅读和维护吗?

case 语句的最后一行无效。

    case when "P_IT_ISSUES"."STATUS" ='Open' 
    then '<aaab style= "    color: green; " >'
    ||to_char("P_IT_ISSUES"."STATUS",'999,999,999,999,999')||'</aaab>'
    when  "P_IT_ISSUES"."STATUS" ='On-Hold' 
    then '<aaab style= "    color: red; " >'
    ||to_char("P_IT_ISSUES"."STATUS",'999,999,999,999,999')||'</aaab>' 
    else '<aaab style= "    color: blue; " >'
    ||to_char("P_IT_ISSUES"."STATUS",'999,999,999,999,999')||'</aaab>' 
    end  as "Status",

如果您不使用双引号标识符并使​​用更简单的 table 别名,您可能还会发现您的代码更易于阅读,但我意识到这段代码可能是从某处生成的。