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

我想进行一个查询,提取所有数字介于 1.63 和 1.75 之间的对象,请注意,上面指定的数字嵌入在字符串中,正如您在上面的 3 个示例中看到的那样,还请注意,这些整个字符串存储在一个专栏,关于如何做到这一点的任何想法?

4

3 回答 3

1

您可以在许多 SQL 方言中这样做:

select *
from t
where right(col, 4) between '1.63' and '1.75'

字符串比较有效,因为数字的小数点位置相同。

于 2013-06-01T23:00:44.670 回答
0
select * from tableName 
where convert(int, substr(columnName,LENGTH(columnName)-4,4)) BETWEEN 1.75 AND 1.63 

这应该可以在不将整数部分限制为某些语法(例如(d.dd))的情况下工作,但要求它的长度为 4。

编辑

之间有更优雅的用法。

于 2013-06-01T23:03:18.093 回答
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

然后使用 right(col,4) 解决方案提取数据还将返回值为 11.64 和 11.75 的行,因为 right(col,4) 会忽略表示 10 的 1。

right(col,4) 解决方案还忽略了可能的字符串到 int 转换的开销,并且还假设 right(col,4) 始终是 int。

更好的解决方案是在列中找到最后一个“,”,然后获取该列的子字符串并与所需范围进行比较。

一个更好且效率更高的解决方案是将数据分解为单独的列,例如 Sex、HairColour、EyeColour、Build、Height 等。这将允许更好的数据库性能,允许更好的数据提取/查询等

于 2013-06-02T00:11:01.173 回答