Sql 查找仅包含多位数整数前几部分的两列之间的匹配
我正在从python3中执行搜索功能,该功能查看sqllite3数据库。 我有一个名为“numberseries”的表,它有不同的列。 有些列是“customername”、“number\u from”、“number\u to”、“total” “数字\从”和“数字\到”字段包含一系列数字的起点和终点 例如: “客户XYX”的编号范围为80201110到80201129。 这两个数字分别输入“数字从”和“数字到”。 “总计”列将包含条目之间的数字差异。在这种情况下是20 我做了一个简单的查询,返回基于以下内容的行:Sql 查找仅包含多位数整数前几部分的两列之间的匹配,sql,sqlite,Sql,Sqlite,我正在从python3中执行搜索功能,该功能查看sqllite3数据库。 我有一个名为“numberseries”的表,它有不同的列。 有些列是“customername”、“number\u from”、“number\u to”、“total” “数字\从”和“数字\到”字段包含一系列数字的起点和终点 例如: “客户XYX”的编号范围为80201110到80201129。 这两个数字分别输入“数字从”和“数字到”。 “总计”列将包含条目之间的数字差异。在这种情况下是20 我做了一个简单的查询
"Select * from numberseries where :value BETWEEN numbers_from and numbers_to;"
如果是一个完整的8位数,它就可以正常工作
然而:
用户需要一个返回相同数据的函数,但如果他们只输入数字的前5位,也需要该函数
例如,如果输入80201,则应返回“number_from”和“number_to”范围内包含80201作为前5位数字的所有行
仅仅用like语句查看“number_from”列是不够的,因为“total”可能是1000多个数字
我希望这是有道理的。
我绝不是一个sql专家,我在这个问题上遇到了困难
更新:
我收到一个澄清的请求
示例数据是一个带有行数的表。为简单起见,它只有以下列:
- 身份证
- 客户名称
- 来自
- 数字(u至)
- 总数
1, "the best customer", 80201110, 80201149, 40
输入可以是:8020113(缺少最后一个数字),我仍然需要匹配示例行,因为8020113x在80201110和80201149之间。假设数据中的数字总是8个字符,那么您可以将其视为字符串,添加一组零并转换回数字:
where cast(substr(value || '00000000', 1, 8) as int) BETWEEN numbers_from and numbers_to;
根据你对另一个答案的最后评论,你真正想要的是:
select * from numberseries
where :value in (
substr(numbers_from, 1, length(:value)),
substr(numbers_to, 1, length(:value))
)
或:
将整数值转换为字符。发布示例数据和预期结果以进行澄清。我在原始帖子中添加了额外的澄清。这样效果更好,但仍会遗漏某些行。例如,它不会返回一个数字从=80101500到=80101599的记录,输入值是前5位数字。我详细介绍了你的记录,所以它可以工作:从数字序列中选择*其中数字从中间转换(substr('8010'| |'00000000',1,8)和转换(substr('8010'| |'999999',1,8)作为int)或数字从中间转换(substr('8010'| |'00000000',1,8)作为int)和cast(substr('8010'| |'9999999',1,8)作为int);它仍然没有捕捉到输入值介于两者之间的值,但没有精确匹配。例如,在XX4xxx和XX6xxx范围内的XXXX5,下面的修改似乎更好:从数字系列中选择*,其中:substr之间的值(numbers_-from,1,length(:value))和substr(numbers_-to,1,length(:value))@BLC检查我的第二个查询。
select * from numberseries
where :value BETWEEN substr(numbers_from, 1, length(:value)) and numbers_to || ''