2014-01-17 22 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 
相關問題