【问题标题】:Oracle case for nullOracle 案例为空
【发布时间】:2015-01-02 12:03:33
【问题描述】:

我在这个网站上搜索了很长时间,并在这个网络上遇到了几个类似的问题,但无法解决我的问题。我有一个存储过程,其中有一个参数 SP_BRANCH_ID,我想要一个情况,如果它为 null,则检索我的表中的 fkBranchId = null,否则在 Sp_branch_id 中指定的那些。

PROCEDURE USP_GET_TAX_RATES_BY_ID(SP_CURSOR OUT T_CURSOR,SP_BRANCH_ID IN NUMBER)
IS 
BEGIN 
   OPEN SP_CURSOR FOR
      SELECT "TaxRates".* from "TaxRates" where "IsDeleted" = 'N' AND "fkBranchId" =(
         case when  SP_BRANCH_ID is null then null else (SP_BRANCH_ID) end );
END USP_GET_TAX_RATES_BY_ID;  

【问题讨论】:

  • 我们可以借助 nvl 本身来做到这一点,例如:nvl(sp_branch_id,null)。为什么这里需要案例?
  • 因为从前端如果我没有选择任何分支,null 将进入 db
  • 没关系...检查空 NVL 的存在就足够了。您是否尝试在 where 子句中使用 nvl 的帮助?
  • 是的,它没有检索到任何东西
  • @Sana,NULL 永远不等于任何东西,也不等于 NULL。它具有三重价值。

标签: sql oracle null case


【解决方案1】:

当 SP_BRANCH_ID 为 null 时,您分配的是 "fkBranchId" = NULL,这在 Oracle 中是错误的用法。

使用IS NULL 进行空检查。

PROCEDURE USP_GET_TAX_RATES_BY_ID(SP_CURSOR OUT T_CURSOR,SP_BRANCH_ID IN NUMBER)
IS 
BEGIN 
   OPEN SP_CURSOR FOR
      SELECT "TaxRates".* from "TaxRates"
       WHERE "IsDeleted" = 'N'
       AND ( "fkBranchId" = SP_BRANCH_ID OR (SP_BRANCH_ID IS NULL AND "fkBranchId" IS NULL))
END USP_GET_TAX_RATES_BY_ID;

【讨论】:

  • 好点 Mahesh +1。 @OP 应该知道三值 NULL 在 Oracle 中是如何解释的。任何等于 NULL 的东西都是没有意义的。我希望 Oracle 消除空字符串和 NULL 之间的两难境地。
【解决方案2】:

你可以用字符串替换空检查

SELECT "TaxRates".* from "TaxRates"
   WHERE "IsDeleted" = 'N'
   and NVL("fkBranchId" ,'null')=NVL(SP_BRANCH_ID,'null');

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多