我的架构中有一列包含如下值:
male, Brown, Blue, Small body build, 1.63
male, Brown, Blue, Small body build, 1.85
male, Brown, Blue, Small body build, 1.75
我想创建一个查询,提取所有数字位于1.63和1.75之间的对象。注意上面指定的数字嵌入在字符串中,如上面的3个示例所示,并注意这些整个字符串是存储在一列中,有关于如何做到的任何想法吗?
答案 0 :(得分:1)
您可以在许多SQL方言中执行此操作:
select *
from t
where right(col, 4) between '1.63' and '1.75'
字符串比较有效,因为数字在同一位置有小数位。
答案 1 :(得分:0)
select * from tableName
where convert(int, substr(columnName,LENGTH(columnName)-4,4)) BETWEEN 1.75 AND 1.63
这应该不会将Integer部分限制为某种语法(例如(d.dd)),但要求它的长度为4。
修改强>
之间有更优雅的用法。
答案 2 :(得分:0)
虽然解决方案提供了小样本集的工作,但它们可能无法与列中的所有可能数据一起使用。例如,如果您有数据,如下面的数据
male, Brown, Blue, Small body build, 1.63
male, Brown, Blue, Small body build, 1.85
male, Brown, Blue, Small body build, 1.75
male, Brown, Blue, Small body build, 11.63
male, Brown, Blue, Small body build, 11.85
male, Brown, Blue, Small body build, 11.75
然后使用右(col,4)解决方案提取数据也将返回值为11.64和11.75的行,因为右(col,4)将忽略代表10的x。
右(col,4)解决方案也忽略了可能的字符串到int转换的开销,并且还假设right(col,4)始终是int。
更好的解决方案是在列中找到最后一个','然后获取其中的子串并与所需范围进行比较。
更好的解决方案和效率更高的解决方案是将数据分成单独的列,例如Sex,HairColour,EyeColour,Build,Height等。 这将允许更好的数据库性能,允许更好的数据提取/查询等