如何解决比较两个字母数字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
如何仅返回正确的结果?
解决方法
您可以使用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);
0 + RIGHT(district,2) > 0
在功能区中,district
中的后2个符号是数字。
如果为true,则将由RIGHT()提取2位数字,并且整个表达式的值将大于零(您声称没有'AA0'
或'AA00'
之类的值)。 / p>
如果为false,并且仅存在一个数字,则RIGHT()将给出一个以字母开头的子字符串,其值将为零。
基于此,我将整个值划分为前缀和数字后缀,并在数字部分添加零,使其无条件变为2位数字。该值可用于BETWEEN运算符的直接字符串比较。
函数的目标是将值转换为'AA00'
格式。为此,我们必须将整个值分为文本部分和数字部分,然后将后者标准化(零填充)。
您可以使用任何其他划分方法。例如,您可以使用LIKE '%\\d\\d'
检查值是否包含两位数。或者向后,您可以使用LIKE '\\D\\D%'
确定值是否包含两个字母...这些方法具有相对相等的难度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。