SQL查询:获取范围内的数据



我有一个名为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_binmax_bin(的长度必须相同。因此,必须在表的结构中定义相应的CHECK约束。

然后,我们使用LEFT((函数从要检查的值中提取相同长度的前缀,并检查(使用BETWEEN运算符(前缀是否与行中的范围匹配。

最后一步-我们按长度排序,并取一个前缀长度最大的输出行(即范围最窄(。

最新更新