在CASE中使用函数

时间:2019-04-26 20:25:50

标签: sql oracle

我正在尝试在案例中使用SUBSTRNVL函数。这种情况在select语句的where子句中。

下面的代码给出以下错误:

  

ORA-00905 :缺少关键字

AND ( CASE
        WHEN SUBSTR(upper(p_open_invoice),1,1) = 'Y' THEN
          NVL(P.AMOUNT_DUE_REMAINING,0) = 0
        ELSE
          1=1
      END) 

这看起来像是NVL函数的相等运算符周围的语法错误。

3 个答案:

答案 0 :(得分:2)

(在Oracle中,case表达式不是这样工作的-没有布尔类型可以返回。

最简单的方法是删除大小写并将其表达为简单的逻辑:

AND (SUBSTR(upper(p_open_invoice), 1, 1) <> 'Y' OR
     COALESCE(P.AMOUNT_DUE_REMAINING, 0) = 0 
    )

如果p_open_invoice可以是NULL,则还需要考虑到这一点。

答案 1 :(得分:0)

您不能使用collation作为case..when语句的结果,最好将条件转换为

AND (( SUBSTR(upper(p_open_invoice),1,1)  = 'Y' AND NVL(P.AMOUNT_DUE_REMAINING,0) = 0 ) 
    OR SUBSTR(upper(p_open_invoice),1,1) != 'Y' )

答案 2 :(得分:0)

如果您习惯于使用PL / SQL进行编程,则可能已经发现PL / SQL中存在BOOLEAN类型。但是,在Oracle数据库本身中并非如此。我通常的解决方法是使用返回'Y'或'N'的字符表达式,而不是<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"> <style> .carousel-inner .carousel-item.active, .carousel-inner .carousel-item-next, .carousel-inner .carousel-item-prev { display: flex; } .carousel-inner .carousel-item-right.active, .carousel-inner .carousel-item-next { transform: translateX(33.33333%); } .carousel-inner .carousel-item-left.active, .carousel-inner .carousel-item-prev { transform: translateX(-33.33333%); } .carousel-inner .carousel-item-right, .carousel-inner .carousel-item-left{ transform: translateX(0); } </style> <div class="container text-center my-3"> <div class="row mx-auto my-auto"> <div id="recipeCarousel" class="carousel slide w-100" data-ride="carousel"> <div class="carousel-inner w-100" role="listbox"> <div class="carousel-item active"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=1"> </div> <div class="carousel-item"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=2"> </div> <div class="carousel-item"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=3"> </div> <div class="carousel-item"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=4"> </div> <div class="carousel-item"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=5"> </div> <div class="carousel-item"> <img class="d-block col-4 img-fluid" src="http://placehold.it/350x180?text=6"> </div> </div> <a class="carousel-control-prev" href="#recipeCarousel" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> <a class="carousel-control-next" href="#recipeCarousel" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="sr-only">Next</span> </a> </div> </div> </div> <!-- Scripts are here --> <script src="https://code.jquery.com/jquery-3.4.0.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>TRUE

请牢记这一点-如果您确实想使用与最初的表达式类似的CASE表达式,则可以使用以下代码:

FALSE

此处CASE表达式返回“ Y”或“ N”,然后将其与“ Y”进行比较。