Sql 检查where子句中的null条件

Sql 检查where子句中的null条件,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,在我的过程中如果In_CLIENT_ID为null则返回全局_ID为null的行,如果In_CLIENT_ID有一些值,则返回全局_ID=In_CLIENT_ID的行 当我使用GLOBAL\u ID=IN\u CLIENT\u ID时,如果IN\u CLIENT\u ID有一些值,结果是可以的。但是如果IN\u CLIENT\u ID为空,则结果不是 然后我检查IN\u CLIENT\u ID是否为nullout-side查询及其工作。但我不想两次编写相同的查询 CREATE OR REPLAC

在我的
过程中
如果
In_CLIENT_ID为null
则返回
全局_ID
为null的行,如果
In_CLIENT_ID
有一些值,则返回
全局_ID=In_CLIENT_ID
的行 当我使用
GLOBAL\u ID=IN\u CLIENT\u ID
时,如果IN\u CLIENT\u ID有一些值,结果是可以的。但是如果IN\u CLIENT\u ID为空,则结果不是

然后我检查
IN\u CLIENT\u ID是否为null
out-side查询及其工作。但我不想两次编写相同的查询

CREATE OR REPLACE PROCEDURE PROCEDURE123(
  IN_CLIENT_ID IN VARCHAR2,
  EXP_RECORDSET OUT SYS_REFCURSOR
) AS
BEGIN 
    IF IN_CLIENT_ID IS NULL THEN
        OPEN EXP_RECORDSET FOR  
        SELECT client.id  FROM GLOBAL_CLIENT client 
              WHERE  AND client.GLOBAL_ID IS NULL
          ORDER BY client.id;
    ELSE
        OPEN EXP_RECORDSET FOR  
        SELECT client.id  FROM GLOBAL_CLIENT client 
              WHERE  AND client.GLOBAL_ID=IN_CLIENT_ID
          ORDER BY client.id;
    END IF;
END;

WHERE条款中的条件是否适用

可以通过在where子句中使用AND或连词来实现

OPEN EXP_RECORDSET FOR  
    SELECT client.id  
    FROM GLOBAL_CLIENT client 
    WHERE  ( IN_CLIENT_ID IS NULL AND client.GLOBAL_ID IS NULL) OR 
           ( IN_CLIENT_ID IS NOT NULL AND client.GLOBAL_ID=IN_CLIENT_ID)
    ORDER BY client.id;

可以通过在where子句中使用AND或连词来实现这一点

OPEN EXP_RECORDSET FOR  
    SELECT client.id  
    FROM GLOBAL_CLIENT client 
    WHERE  ( IN_CLIENT_ID IS NULL AND client.GLOBAL_ID IS NULL) OR 
           ( IN_CLIENT_ID IS NOT NULL AND client.GLOBAL_ID=IN_CLIENT_ID)
    ORDER BY client.id;

请尝试以下方法

CREATE OR REPLACE PROCEDURE PROCEDURE123(
    IN_CLIENT_ID IN VARCHAR2,
    EXP_RECORDSET OUT SYS_REFCURSOR
) AS
BEGIN 
    OPEN EXP_RECORDSET FOR  
    SELECT client.id
    FROM GLOBAL_CLIENT client
    WHERE DECODE( client.GLOBAL_ID,
                  client.IN_CLIENT_ID,
                  1,
                  0 ) = 1
    ORDER BY client.id;
END;
以上是根据


如果您有任何问题或意见,请随时发表相应的意见。

请尝试以下内容

CREATE OR REPLACE PROCEDURE PROCEDURE123(
    IN_CLIENT_ID IN VARCHAR2,
    EXP_RECORDSET OUT SYS_REFCURSOR
) AS
BEGIN 
    OPEN EXP_RECORDSET FOR  
    SELECT client.id
    FROM GLOBAL_CLIENT client
    WHERE DECODE( client.GLOBAL_ID,
                  client.IN_CLIENT_ID,
                  1,
                  0 ) = 1
    ORDER BY client.id;
END;
以上是根据


如果您有任何问题或意见,请随时发表相应的意见。

若要澄清,您想返回
客户端.id
,其中两个值均为空或两个值均存在且相等?@toonice yes..回答已更新。若要澄清,是否要返回
客户端.id
,其中两个值均为NULL或存在且相等?@toonice yes..答案已更新。在第二个结果中工作的第一个解决方案具有冗余。client.IN_client_ID-->指定错误无效标识。我删除客户端。还有它的作用。。谢谢如果我想忽略IN_CLIENT_ID(如果为null)。比如如果IN_CLIENT_ID为null,那么它会显示所有记录。如果我想忽略IN_CLIENT_ID,如果它为null。比如如果IN_CLIENT_ID为null,那么它将显示所有记录..我很担心。我将从我的答案中删除第二个选项。在第二个结果中工作的第一个解决方案具有冗余。client.IN_client_ID-->指定错误无效标识。我删除客户端。还有它的作用。。谢谢如果我想忽略IN_CLIENT_ID(如果为null)。比如如果IN_CLIENT_ID为null,那么它会显示所有记录。如果我想忽略IN_CLIENT_ID,如果它为null。比如如果IN_CLIENT_ID为null,那么它将显示所有记录..我很担心。我将从我的答案中删除第二个选项。