【问题标题】:Syntax for comparison expression in Simple case expression in Oracle DB SQLOracle DB SQL 中简单案例表达式中比较表达式的语法
【发布时间】:2014-03-04 04:44:11
【问题描述】:

我正在尝试为包含 CASE 语句的 Oracle SQL 选择语句制作解析器

http://docs.oracle.com/cd/B19306_01/server.102/b14200/img/case_expression.gif

并且oracle参考列出了简单的case表达式可以表示为 http://docs.oracle.com/cd/B19306_01/server.102/b14200/img/simple_case_expression.gif

但是我在参考文献中到处都找不到比较表达式,有人知道它在哪里以及它的样子吗?

【问题讨论】:

    标签: sql oracle syntax antlr antlr4


    【解决方案1】:

    我相信和这里定义的condition是一样的:

    http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions001.htm#SQLRF52101
    

    这意味着它可以是多种东西,需要手册的所有第 7 章来解释它们。它们中的大多数反过来可以包含任意表达式(这是第 6 章的全部内容,加上第 5 章的函数调用)甚至子查询(也是第 9 章的全部内容)。例如,这是一个“简单的案例陈述”:

    SELECT
      CASE
        WHEN (SELECT /* anything that can go in a select statement might be here */) > 0
        THEN 'Y'
        ELSE 'N'
      END
    FROM DUAL
    

    并且在嵌套查询中,您可以拥有各种难以解析的东西。基本上,如果您想以 Oracle 解析它的方式解析 CASE 表达式,那么您就有麻烦了。无法避免解析 Oracle SQL 的其余部分。

    如果您限制自己使用标准 SQL(并且可能禁止子查询),则您完成项目的机会更大。

    好的,第一个答案与事实完全相反。 comparison_expr 是一个 expr,将与紧跟在 CASE 之后的 expr 进行比较。

    【讨论】:

    • 比较条件是否等于比较表达式?似乎情况并非如此,因为我们可以将 case abc when 1 then blah blah blah
    • 那是searched_case_expression,而不是simple_case_expression
    • 我相信它不是 searched_case_expression,因为在 CASE 关键字后面有一个字段,其中 searched_case_expression 的语法是这样的(来自 oracle) CASE WHEN boolean_expression THEN result_value ; [当布尔表达式然后结果值; ]... [ ELSE 结果值; ] 结束案例 ;
    • 你是对的。我把整个事情倒过来了。 comparison_expr 是要与 CASE 表达式进行比较的表达式。
    • 那么comparison_expr只是simple_expression还是只是一个表达式但oracle引用错误地将其设置为“comparison_expr”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多