我有一张金额表。这些金额分为3种方式:半月,每月和每季度。
Amounts表中的数据必须与上述内容相符。
如果有任何不符之处,我需要向我吐口水。
如何编写此代码?
答案 0 :(得分:1)
嗯,你可以检查:
select t.*
from t
where ((amount > 10000 and classification <> 'Semi-Monthly') or
(amount <= 10000 and amount > 5000 and classification <> 'Monthly') or
(amount <= 5000 and classification <> 'Quarterly')
);
这将返回差异。
答案 1 :(得分:1)
将金额和分类同时放在同一张表中是一个坏主意。你有冗余数据,这就是为什么你现在害怕这两列可能不匹配的原因。
为具有适当范围的分类设置单独的表格:
table classification ==================== text | range_start | range_end -------------+-------------+---------- Semi-Monthly | 10001 | null Monthly | 5001 | 10000 Quarterly | null | 5000
并从表中删除分类。然后,只要需要从连接中获取分类:
select m.*, c.text as classification
from mytable m
join classification c on m.amount between coalesce(c.range_start, m.amount)
and coalesce(c.range_end, m.amount);