使用“减号”操作来查找是不是满足条件

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 实例,但你显然做错了什么。 IIFNVLCASE .. 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
 )

【讨论】:

以上是关于使用“减号”操作来查找是不是满足条件的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个表中查找多个列满足不同条件的记录?

在满足条件之前查找值

电源查询:如果满足条件,则查找最小日期

EXCEL中如何查找区域内满足条件的值,并依次将其对应的值依次输出至指定区域?

二分查找

linq+lambda+delegate,从list中查找到满足匹配条件的所有数据索引值