2014-01-17 21 views
0

用户输入两个数据,这是一个间隔期,并在数据库中存储为INT。 假设我有如下的数据:允许未在SQL Server中使用查询输入数据

Table :cheque_book_mcg 

id acc_no cheq_bk_no cheq_no_frm cheq_no_to sch_id no_from  no_to 
401 010000001 285  01029101  01029125 010 29101  29125 
402 001000467 277  00130326  00130350 001 30326  30350 
403 001000467 54  00122252  00122275 001 22252  22275 
404 001000467 1149  00167551  00167575 001 67551  67575 
405 003000016 45  00322301  00322325 003 22301  22325 
406 001000468 46  00122326  00122350 001 22326  22350 
407 001000470 335  00122401  00122425 001 22401  22425 
408 001000471 848  00164651  00164675 001 64651  64675 
409 001000471 1346  00145476  00145500 001 45476  45500 

用户可以进入的间隔(no_from和no_to)如需要的话,这是不重复条目。 这样,在当前上下文中,用户可以输入(no_from = 1和no_to = 10),然后如果用户输入(21和30),它也必须是有效的,并且之间也存在间隔差距,所以之后如果用户想要添加(11和20)的数据,应该是有效的,参考上面输入的数据,用户也可以输入剩余的时间间隔,上表中最高的时间间隔是(67551和67575),所以用户也可以输入从(67576等)开始的时间间隔,用户也可以输入低于上面输入的时间间隔的时间间隔以及输入数据之间的间隔时间。但不应该重复,间隔。我写了一个查询,如下所示:

SELECT 
CASE WHEN ((select MAX(id) from cheque_book_mcg WHERE no_to < 1) = (select MIN(id) from cheque_book_mcg WHERE no_from <= 20)) 
THEN 
'yes' 
ELSE 
'no' 
END as valid 

这适用于进入该表提供的数据之间的时间间隔,但较低的间隔比以前输入的时间间隔下无法正常工作和较高的间隔不工作高于先前输入的时间间隔。

如何实现这个目标?

+0

是否要上一个是否有重叠的范围?所以如果你的范围(1,20)存在,范围(11,30)应该被拒绝? –

+0

是的,就是这样。 – SudeepShakya

回答

2

您可以通过exists()条件范围要检查像

if exists(select id from cheque_book_mcg 
      where ((@from_no between no_from and no_to) 
      or (@to_no between no_from and no_to))) 
print 'no' -- already range exists, don't insert 
else 
print 'yes' -- no any range, can insert 

使用CASE WHEN条款像

SELECT CASE WHEN exists(select id from cheque_book_mcg 
         where ((@from_no between no_from and no_to) 
         or (@to_no between no_from and no_to))) 
      THEN 'no' ELSE 'yes' END as Valid 
+0

我会尽力回复。 – SudeepShakya

+0

我认为它的工作,但事情是,我需要将值'是'或'否'返回给java代码,可以'打印'映射到java代码? – SudeepShakya

+0

您可以返回'是'或'否'或任何1或0值而不是打印。你使用存储过程吗?如果存在存储过程,则在任何变量中保存是/否值,然后将其返回 –

0

像这样的触发将防止重叠的支票号码范围的插入检查对于给定的帐号:

CREATE TRIGGER PreventOverlappingChequeNumbers ON cheque_book_mcg 
FOR INSERT, UPDATE AS 
BEGIN 

    IF EXISTS(
     SELECT * 
     FROM cheque_book_mcg cbm 
     INNER JOIN inserted i 
     ON ((cbm.no_from <= I.no_to AND i.no_from <= cbm.no_from) 
     AND cbm.acc_no = i.acc_no)) 
    BEGIN 
     RAISERROR('Cheque number ranges may not overlap', 16, 1) 
     ROLLBACK 
    END 
END 
相关问题