用于在混合数字和数字中选择“大于”的SQL查询文本域

时间:2016-04-27 21:19:24

标签: mysql sql regex

请假设桌面设计不会改变。我知道这不完美。想象一下包含这些行的单列数据库表:

0.8 ounces
1.8 ounces
1 ounce
2 ounces
15 ounces
15.6 ounces
1 pound
9.9 pounds
15 pounds
100.1 pounds

注意小数和复数是多少。

我需要帮助构建一个SELECT查询,它不包含任何超过10磅的行。

换句话说,SELECT查询忽略上面数据库表中的最后两行。

3 个答案:

答案 0 :(得分:1)

如评论部分所述:更改表格设计并将其设为两列。你甚至应该有一个单位表和转换因子。

但是,如果你真的需要保留这个表并仍然需要与10磅进行比较,那么可以使用字符串函数和转换的一些条件来解决这个问题,如下所示。再说一遍:我不推荐这个。改为换你的桌子!

您可以使用SUBSTRING_INDEX获取字符串中的值:

SUBSTRING_INDEX(col, ' ', 1)

您可以将值字符串转换为数字:

CAST( SUBSTRING_INDEX(col, ' ', 1) AS DECIMAL(10,2) )

(但我必须承认,我不知道这是否适用于使用逗号作为小数分隔符的区域设置。可能你必须首先用小数分隔符替换点,但是我不知道我不知道如何确定在MySQL中将哪个符号设置为小数分隔符。)

您获得的单位包含SUBSTRING_INDEX和负数统计参数:

SUBSTRING_INDEX(col, ' ', -1)

一盎司是0.0625磅。

因此:

select *
from mytable 
where 
  cast( substring_index(col, ' ', 1) as decimal(10,2) ) *
  case when SUBSTRING_INDEX(col, ' ', -1) in ('ounce', 'ounces') then 0.0625 
       when SUBSTRING_INDEX(col, ' ', -1) in ('pound', 'pounds') then 1
       else null
  end <= 10;

答案 1 :(得分:0)

将数字数据存储为字符串非常糟糕,无论如何,您可以尝试将其转换回来,如下所示:

select *
from (
select title,
(case
when title like '%ounce%' then title/16.0
when title like '%pound%' then title*1.0
else null
end) as weightinpound
from (
select '0.8 ounces' as title union all
select '1.8 ounces' union all
select '1 ounce' union all
select '2 ounces' union all
select '15 ounces' union all
select '15.6 ounces' union all
select '1 pound' union all
select '9.9 pounds' union all
select '15 pounds' union all
select '100.1 pounds'
) as q
) as q2
where weightinpound <= 10.0

这里是样本小提琴http://www.sqlfiddle.com/#!9/9eecb7d/56696

答案 2 :(得分:0)

如果你想使用正则表达式,这是一个匹配任何大于10的浮点/整数值的工作,以便你可以使用NOT REGEXP

where title NOT REGEXP '(^|[^[:alnum:].])(10([.]0*[1-9])|([0-9]{3}|[2-9][0-9]|1[1-9])([.][0-9]*)?)[[:space:]]*pound'

请参阅regex demoSQL fiddle

模式细节:

  • (^|[^[:alnum:].]) - 字符串的开头或非字母数字而非点
  • (10([.]0*[1-9]) - 10后跟小数点分隔符,0 + 0和非零数字
    |([0-9]{3} - 或任意3位数字 |[2-9][0-9] - 或20到99整数 |1[1-9]) - 或11-19整数
  • ([.][0-9]*)?) - 一个或零(可选)小数部分
  • [[:space:]]*pound - 0+空格后跟单词&#34; pound&#34;。