我有一个表,其中的列包含数字和单位的字符串值。这些值包含由整数和一个小数组成的前缀中的数值。
这些值的一些例子如下:
"16 GB", "8.5gb", "15.99345 GHz", "25L"
有没有办法可以使用强制转换函数来首先解析包含数字和小数的字符串值,并且只对这部分值进行强制转换?
这就是我的想法
select * from my_table
where cast( numparse( my_column ) as signed ) > 10
在此先感谢,我对SQL很新,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
是的,您可以编写一个stored procedure进行某种字符串解析,或use a regex as in @ladd2025's answer ...
但是你会在每次查询时重做这个转换。这是转换的成本,但也意味着您无法利用索引。像where parse_the_thing( thing ) > 10
这样的查询必须进行全表扫描。如果thing
是以where thing > 10
开头的索引编号,则是一个非常快速的索引查询。这是存储“格式化”信息的问题,每次要对其执行某些操作时都必须删除格式。
将标准化存储数据以将幅度存储为numeric data type such as bigint, double, or numeric,将单位存储为enum column,您会好得多。或者考虑将所有这些不同单位存储在同一个表中是否有意义;比较8.5 gb和15.99 Ghz是否有意义?
存储在字节中的 8.5gb
将成为单位bigint
的{{1}} 8,500,000,000(确切值取决于它是1000字节还是1024字节)。 bytes
可能会成为单位15.99345 GHz
的{{1}} 15,993,450,000。等等。
您可以通过向表中添加新列并执行更新以将字符串转换为单位和数量来实现此目的。然后更改输入值的任何内容以执行相同操作。如果您愿意,可以继续存储原始的人工格式化字符串,但最好不要根据需要应用格式。
这使您的查询更简单,错误的机会更少。他们可以利用索引,因此它们会更快,更快。
答案 1 :(得分:0)
您可以使用REGEXP_REPLACE
:
SELECT *
FROM tab
WHERE CAST(REGEXP_REPLACE(my_column, '[^0-9/.]', '') AS signed) > 10;
<强> DBFiddle Demo 强>
答案 2 :(得分:0)
只需使用CAST()
功能即可。如果您要转换为数字类型,它只会解析前缀并忽略其余部分。
mysql> select cast('12.45gb' as signed);
+---------------------------+
| cast('12.45gb' as signed) |
+---------------------------+
| 12 |
+---------------------------+