什么是在oracle中使用is null运算符检查null的替代方法

时间:2014-11-18 06:48:58

标签: sql oracle plsql

我编写了一个存储过程,从一个表中选择(某些列具有空数据)并插入到没有重复的其他表中。

我的存储过程代码的一部分:

 LOOP
   BEGIN
     SELECT ID
       INTO ROWCOUNT
   FROM TBL_EMPLOYEE
 WHERE 

     NAME      = TEMPTABLE.NAME
  AND AGE           =TEMPTABLE.AGE

EXCEPTION
WHEN no_data_found THEN
  ROWCOUNT := 0;
END;
IF ROWCOUNT = 0 THEN
  INSERT INTO TARGET TABLE ......

在上面的代码中,某些列有空数据(例如:TEMPTABLE.AGE等)。 当有空值时,它会抛出no_data_found异常并插入数据。我们通过放置nvl函数来尝试,这需要花费更多时间。

LOOP
BEGIN
  SELECT ID
  INTO ROWCOUNT
  FROM TBL_EMPLOYEE
 WHERE 

     nvl(NAME,0000)      = nvl(TEMPTABLE.NAME,0000)
  AND nvl(AGE,0000)           =nvl(TEMPTABLE.AGE,0000)

EXCEPTION
WHEN no_data_found THEN
  ROWCOUNT := 0;
END;
IF ROWCOUNT = 0 THEN
  INSERT INTO TARGET TABLE ......

任何人都可以建议任何替代方法如何使用等于运算符进行空检查。 我也尝试过LIKE,但它没有用。

6 个答案:

答案 0 :(得分:1)

你正在以错误的方式进行检查。完全消除ROWCOUNT变量和循环并使用NOT EXISTS()

BEGIN
  INSERT INTO TARGET_TABLE
  SELECT .....
  FROM DUAL 
  WHERE NOT EXISTS (
    SELECT *
    FROM TBL_EMPLOYEE
    WHERE nvl(NAME,0000) = nvl(TEMPTABLE.NAME,0000)
    AND nvl(AGE,0000) = nvl(TEMPTABLE.AGE,0000);
END

您的情况可能有错误:如果您打算将两个空值视为“相等”,请将条件更改为:

WHERE (NAME = TEMPTABLE.NAME OR NVL(NAME, TEMPTABLE.NAME) IS NULL)
AND (AGE = TEMPTABLE.AGE OR NVL(AGE, TEMPTABLE.AGE) IS NULL)

答案 1 :(得分:0)

替换

nvl(NAME,0000) = nvl(TEMPTABLE.NAME,0000)

(NAME is NULL and TEMPTABLE.NAME is null or NAME = TEMPTABLE.NAME)

答案 2 :(得分:0)

我想你想这样做:

NAME = VALUE {in case of Some Value}

NAME IS NULL {in case the value is null}

ORACLE不会自己处理它。我认为这是一个合乎逻辑的条件,这应该在逻辑上处理。如果我已正确回答/理解你,请告诉我?

答案 3 :(得分:0)

尝试用最简单的术语解释您想要完成的任务。你提出了一系列令人困惑的要求,并且投入了一些代码,这些代码无论如何都可能使我们错误地走上正轨。可能你需要的东西可以在一个语句中完成,没有循环。一些尝试:

通过某些键列[name,age]删除重复项,以另一列的值来区分。

INSERT INTO target (name,age,other_value1,other_value2)
SELECT
  name, age,other_value1,other_value2
FROM (
  SELECT
    name,
    age,
    other_value1,
    other_value2,
    ROW_NUMBER() OVER (PARTITION BY name,age ORDER BY other_value1) rn
  FROM source
  ) WHERE rn = 1

区分列可以是输入数据的时间戳,您可以使用ROW_NUMBER() OVER (PARTITION BY name,age ORDER BY time_entered DESC) rn之类的内容保留最新记录。

根据所有列

删除重复项
INSERT INTO target (name,age,other_value1,other_value2)
SELECT
  name, age,other_value1,other_value2
FROM source
GROUP BY name,age,other_value1,other_value2

答案 4 :(得分:0)

BEGIN
  SELECT ID
  INTO ROWCOUNT
  FROM TBL_EMPLOYEE
 WHERE decode(NAME,TEMPTABLE.NAME,1)=1
   AND decode(AGE,TEMPTABLE.AGE,1)=1
EXCEPTION
WHEN no_data_found THEN
  ROWCOUNT := 0;
END;

它适用于任何简单的数据类型 - 数字varchar2,日期等。

答案 5 :(得分:0)

我的解决方案是:

SELECT Name,Age FROM TBL_EMPLOYEE WHERE NAME ='yourName'AND ((AGE = yourAge)OR(AGE为NULL且yourAge为NULL))

这里NAME和AGE是表列名。 'yourName'和'yourAge'是传递的运行时值。

如果它不适合你,请告诉我。