用户输入两个数据,即间隔期,并在数据库中存储为INT。 假设我有以下数据:
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)然后输入if 用户输入(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 :(得分: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
答案 1 :(得分: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