使用“减号”操作来查找是不是满足条件
Posted
技术标签:
【中文标题】使用“减号”操作来查找是不是满足条件【英文标题】:using the "minus' operation to find if a condition is met使用“减号”操作来查找是否满足条件 【发布时间】:2018-05-13 07:57:14 【问题描述】:好的,所以我正在尝试使用 pl/sql 来确定是否存在值或没有值。我知道我可能不得不使用“计数”,但不确定如何或在哪里。这就是我目前所拥有的......
CREATE OR REPLACE PROCEDURE Validate_Prereq_Met
AS
(
p_snum IN Enrollments.snum%TYPE,
p_callnum IN Enrollments.Callnum%TYPE
)
v_pcnum VARCHAR2;
v_cnum VARCHAR2;
BEGIN
--classes needed minus classes taken
SELECT pcnum AS v_pcnum
FROM prereq
WHERE cnum IN (SELECT cnum
FROM schclasses
WHERE callnum = p_callnum)
MINUS
SELECT cnum AS v_cnum
FROM enrollments, schclasses
WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
END;
我需要它不返回任何内容(意味着满足要求)或返回一个值(意味着不满足要求)。
【问题讨论】:
我手头没有 oracle 实例,但你显然做错了什么。IIF
,NVL
,CASE .. END
(终于!)是你的朋友。您的问题是 Oracle SQL 比 PL/SQL 更多。 (PL - 类似于 Ada 的构造:begin..end
、循环、变量声明等)
@ignaz - MINUS 集合运算符是解决此问题的一种完全有效的方法。为什么你认为这是“非常错误”?
【参考方案1】:
你有两个小错别字:
“As”后面的参数。替换 plsql-block 的“声明”
如果 VARCHAR 不是参数,则必须用长度定义(例如:VARCHAR2(100))。但是你想用 NUMBER 来计算。
如何减去值
CREATE OR REPLACE PROCEDURE Validate_Prereq_Met
(
p_snum IN Enrollments.snum%TYPE,
p_callnum IN Enrollments.Callnum%TYPE
)
AS
v_pcnum NUMBER;
v_cnum NUMBER;
v_result NUMBER;
BEGIN
--classes needed minus classes taken
SELECT pcnum AS v_pcnum
FROM prereq
WHERE cnum IN (SELECT cnum
FROM schclasses
WHERE callnum = p_callnum)
SELECT cnum AS v_cnum
FROM enrollments, schclasses
WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
v_result := v_pcnum - v_cnum;
dbms_output.put_line('v_result : ' || v_result );
END;
如何用这些来制作函数
如果你声明一个函数,你可以返回你的结果值:
CREATE OR REPLACE FUNCTION Validate_Prereq_Met (
p_snum IN Enrollments.snum%TYPE,
p_callnum IN Enrollments.Callnum%TYPE)
RETURN NUMBER
AS
v_pcnum NUMBER;
v_cnum NUMBER;
v_result NUMBER;
BEGIN
--classes needed minus classes taken
SELECT pcnum AS v_pcnum
FROM prereq
WHERE cnum IN (SELECT cnum
FROM schclasses
WHERE callnum = p_callnum);
SELECT cnum AS v_cnum
FROM enrollments, schclasses
WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
v_result := v_pcnum - v_cnum;
RETURN v_result;
END;
你使用了减号
您使用的MINUS
不会减去值。它用于从另一个值中减去一组值。
例子:
我们有两个表 - 一个包含 1,2 和 3 一个包含 1 和 3。 现在我们可以从表 1 中减去表 2 的值。
SELECT *
FROM (SELECT 1 FROM DUAL -- fake-table 1: 1,2,3
UNION ALL
SELECT 2 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL)
MINUS
SELECT *
FROM (SELECT 1 FROM DUAL -- fake-table 2: 1,3
UNION ALL
SELECT 3 FROM DUAL)
-- Result: 2
【讨论】:
啊,是的。感谢您指出这些错别字!当我回到家时,我会使用你给我的东西,看看它是否有帮助。谢谢 这里的MINUS是集合运算,不是减法。啊。 @MaheswaranRavisankar 正确。添加了一个例子来解释它。【参考方案2】:如何使用NOT EXISTS
进行单个查询
SELECT pcnum
FROM
prereq p,
schclasses schclasses
WHERE p.cnum = s.cnum
AND s.callnum = p_callnum
AND NOT EXISTS
(
SELECT 'X' from enrollments e
WHERE e.callnum = s.callnum
AND e.snum = p_snum
)
【讨论】:
以上是关于使用“减号”操作来查找是不是满足条件的主要内容,如果未能解决你的问题,请参考以下文章