【问题标题】:OVERLAPS operator to check multiples rowsOVERLAPS 运算符检查多行
【发布时间】:2015-07-28 06:56:27
【问题描述】:

目前我正在使用重叠运算符,以便用户无法插入重叠的日期。我创建了这个函数:

    CREATE OR REPLACE FUNCTION overlap(docent_medewerkerscode1 CHARACTER(7),  
lokaal1 TEXT, groep_groepsnaam1 TEXT, startdatum1 timestamp, einddatum1 
timestamp)

RETURNS TEXT AS $$
DECLARE
    resultaat TEXT;
    rec rooster%rowtype;
BEGIN 
    FOR rec IN SELECT groep_groepsnaam = groep_groepsnaam1 OR lokaal =      
lokaal1 OR docent_medewerkerscode = docent_medewerkerscode1 FROM rooster 
  LOOP
        IF(startdatum1, einddatum1) OVERLAPS (startdatum, einddatum) FROM  
rooster THEN
           --IF startdatum1 BETWEEN startdatum AND einddatum AND einddatum1 BETWEEN startdatum AND einddatum FROM rooster THEN
            resultaat = 'tijd overlapt';
            RAISE 'Niet mogelijk tijd komt overeen met ingeplande tijd';
        END IF;
  END LOOP;

RETURN resultaat;
END;
$$ LANGUAGE plpgsql;

问题是重叠不适用于多行。

(错误:查询“SELECT (startdatum1, einddatum1) OVERLAPS (startdatum, einddatum) FROM rooster”返回多行)

我正在寻找一种方法,让我们对选择查询中的每一行进行重叠检查。你们有谁知道我能做什么?

【问题讨论】:

  • 一如既往地,请提供您的 Postgres 版本。在问题中。

标签: postgresql database-design plpgsql overlap


【解决方案1】:

错误消息的直接原因是plpgsql IF statement 需要单个布尔表达式,而您的代码返回一整套布尔表达式。

IF(startdatum1, einddatum1) OVERLAPS (startdatum, einddatum) FROM  
rooster THEN

是一种丑陋的简短形式:

IF (SELECT(startdatum1, einddatum1) OVERLAPS (startdatum, einddatum)
    FROM  rooster) THEN

这样就无效了。你将不得不聚合或使用EXISTS:

IF EXISTS (
   SELECT 1 FROM  rooster r
   WHERE  (startdatum1, einddatum1) OVERLAPS (r.startdatum, r.einddatum)
   ) THEN ...

更重要的是,exclusion constraint 几乎可以肯定是解决您问题的更好方法(需要 Postgres 9.0+):

【讨论】:

  • 感谢您的建议,这一定会有所帮助!
猜你喜欢
  • 2011-11-28
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多