2016-11-15 67 views
0

我想根据条件设置ret“0”或“1”真或false.I有写以下Oracle SQL查询:预言:INTO子句中Case语句不工作的其他选项

DECLARE 
member_code VARCHAR2(3); 
person_id VARCHAR2(3); 
ret VARCHAR2(1); 
BEGIN 
person_id := 'id1'; 
member_code := '123'; 
SELECT CASE WHEN PER_ID = person_id AND MEM_CODE = member_code THEN '1' ELSE '0' END 
into ret 
FROM Table_Persons 
WHERE PER_ID = person_id AND MEM_CODE = member_code; 
DBMS_OUTPUT.PUT_LINE(ret); 
END; 

的代码工作正常,如果它得到大小写匹配并返回'1'。 但是,如果没有匹配,代码不会返回“0”。相反,它会显示错误ORA-01403: no data found。所以,我如何评估ELSE '0'没有发现case.please help.thanks

+1

SELECT INTO语句无行为回。检查NVL功能。 –

+0

我很疑惑...你的情况是WHERE PER_ID = person_id和MEM_CODE = member_code;'。你怎么能得到一个会产生'0'的记录?我错过了什么吗? – FDavidov

回答

1

为了总是返回一行使用聚合函数。对于您的CASE表达式,还需要NVLCOALESCE来处理NULL值。

SELECT NVL(MAX(CASE WHEN PER_ID = person_id AND MEM_CODE = member_code THEN '1' END), '0') 
into ret 
FROM Table_Persons 
WHERE PER_ID = person_id AND MEM_CODE = member_code; 

还是要容易得多:

SELECT COUNT(*) 
into ret 
FROM Table_Persons 
WHERE PER_ID = person_id AND MEM_CODE = member_code; 

发现,否则为0时返回数字1。 (如果PER_IDMEM_CODE在表格中不唯一,则后一个查询可能会导致大于1的值。在这种情况下,您可能需要在查询结尾处添加AND rownum = 1。)

+0

谢谢@Thorsten Kettner。我去找第二个解决方案 – user5005768