我有一个名为tbl_bin_ranges的表,我需要找到是否会对卡号应用附加费?
tbl_bin_ranges
id low_bin max_bin is_surcharge
---------------------------------------------------------
1 545454 545460 1
2 100000 100000 0
3 545 550 0
此处,如果客户将卡号传递为5454555454555454,则应返回带值的第1行,因为最初的6位数字位于第1行的范围内。
我不得不应用多个where或来解决这个问题。所以我想知道,如果表的长度因任何其他条件而增加,那么使用多个where或是否是一个好的选择。
样品工作查询:
SELECT
*
FROM
`tbl_card_bin_range`
WHERE
1 = 1 AND(
(
low_bin <= '545' AND max_bin >= '545'
) OR(
low_bin <= '5454' AND max_bin >= '5454'
) OR(
low_bin <= '54545' AND max_bin >= '54545'
) OR(
low_bin <= '545455' AND max_bin >= '545455'
) OR(
low_bin <= '5454555' AND max_bin >= '5454555'
) OR(
low_bin <= '54545554' AND max_bin >= '54545554'
) OR(
low_bin <= '545455545' AND max_bin >= '545455545'
) OR(
low_bin <= '5454555454' AND max_bin >= '5454555454'
) OR(
low_bin <= '54545554545' AND max_bin >= '54545554545'
)
)
ORDER BY
CHAR_LENGTH( low_bin ) DESC, CHAR_LENGTH( max_bin )
DESC
看起来您需要
SELECT *
FROM tbl_card_bin_range
WHERE LEFT(@passed_card_number, LENGTH(low_bin)) BETWEEN low_bin AND max_bin
ORDER BY LENGTH(low_bin) DESC LIMIT 1
它是如何工作的?
首先,我们使用LENGTH(low_bin)
来确定当前行中前缀的长度重要一行中两列值(low_bin
和max_bin
(的长度必须相同。因此,必须在表的结构中定义相应的CHECK约束。
然后,我们使用LEFT((函数从要检查的值中提取相同长度的前缀,并检查(使用BETWEEN运算符(前缀是否与行中的范围匹配。
最后一步-我们按长度排序,并取一个前缀长度最大的输出行(即范围最窄(。