比较两个字母数字mysql列(查找范围之间的邮政编码区域)

我有一个mysql数据库,其中包含一系列邮政编码区域范围。 我试图找到与给定地区匹配的行,在本示例中为“ SY18”。 我在下面有mysql查询,但是它返回表中的两个值,因为字段是字母数字。

SELECT rate FROM table WHERE district_from <= 'SY18' AND district_to >= 'SY18'

表格示例

id    district_from    district_to    rate
1     SY1              SY9            10
2     SY16             SY22           20
3     AL1              AL99           37
4     B1               B99            37
5     BB1              BB99           37
6     CB1              CB99           40

如何仅返回正确的结果?

houyong888 回答:比较两个字母数字mysql列(查找范围之间的邮政编码区域)

您可以使用SUBSTR跳过字符串的第一个字符,然后使用+0将值视为数字。示例:

SELECT v
FROM
(SELECT 'SY1' v UNION SELECT 'SY16') t
WHERE SUBSTR(t.v,3)+0 > 10
;
,
CREATE FUNCTION normalize_district (district VARCHAR(4))
RETURNS VARCHAR(4) DETERMINISTIC
RETURN CONCAT( TRIM(TRAILING CASE WHEN 0 + RIGHT(district,2) > 0 
                                  THEN RIGHT(district,2)
                                  ELSE RIGHT(district,1) END FROM district),LPAD(CASE WHEN 0 + RIGHT(district,2) > 0 
                         THEN 0 + RIGHT(district,2)
                         ELSE 0 + RIGHT(district,1) END,2,'0') );

然后

SELECT *
FROM district_to_test
LEFT JOIN rate ON normalize_district(district_to_test.district) 
                         BETWEEN normalize_district(district_from)
                             AND normalize_district(district_to);

fiddle


0 + RIGHT(district,2) > 0在功能区中,district中的后2个符号是数字。

如果为true,则将由RIGHT()提取2位数字,并且整个表达式的值将大于零(您声称没有'AA0''AA00'之类的值)。 / p>

如果为false,并且仅存在一个数字,则RIGHT()将给出一个以字母开头的子字符串,其值将为零。

基于此,我将整个值划分为前缀和数字后缀,并在数字部分添加零,使其无条件变为2位数字。该值可用于BETWEEN运算符的直接字符串比较。


函数的目标是将值转换为'AA00'格式。为此,我们必须将整个值分为文本部分和数字部分,然后将后者标准化(零填充)。

您可以使用任何其他划分方法。例如,您可以使用LIKE '%\\d\\d'检查值是否包含两位数。或者向后,您可以使用LIKE '\\D\\D%'确定值是否包含两个字母...这些方法具有相对相等的难度。

本文链接:https://www.f2er.com/1319177.html

大家都在问