比较值是否在数字范围内 mysql

Compare if value is within range of number mysql

在我的数据库中,我有 2 列,即:Min and Max 它们是 varchar,它们具有我需要与之比较的数值。我的查询是这样的

SELECT * FROM Pricing_tbl WHERE Productid='10'

我有这个可以比较价格

while ($selected_row = $stmt - > fetch(PDO::FETCH_ASSOC)) {
    if ($marketval > $selected_row['Min'] && $marketval < $selected_row['Max']) {
        $price[] = array('price_level' => $selected_row['price_level']);
    }
}

如果 MinMax 的值始终是数字,这没问题。但是有一个实例Max的值是above。这种情况怎么比较?

示例值为

或者我应该只更改 Max 值。任何建议表示赞赏

假设最大值 above 意味着一直到无穷大,并且您想保持数据原样 1,您可以改变条件:

$marketval > $selected_row['Min'] && $marketval < $selected_row['Max']

变成类似这样的东西:

$marketval >= $selected_row['Min'] &&
    ($selected_row['Max'] == 'above' || $marketval < $selected_row['Max'])

换句话说,如果最大值是单词 above,则值被认为低于最大值 always。否则实际(原始)比较决定。

PHP 逻辑运算符的短路将确保如果前半部分为真,则 or 部分的后半部分将永远不会被计算。

请注意我对最小比较所做的更改,使用 >= 而不是 >。事实上,像 300000.01 这样的值不会被捕获。

可能 还想在与 $marketValue 的比较中强制转换数字。如果 $marketValue$selectedRow['whatever'] 都是字符串,我 认为 他们仍然会使用数字比较,但我通常尽量明确,所以我不必思考关于它:-)


1 可能有更好的方法可以做到这一点,除了将 大部分 数字数据存储为字符串只是因为你想能够存储值 'above'.

下面的两种方法都涉及将列类型转换为数字类型,这样可以进行更好的比较,包括让 DBMS 自己解决而不是必须获取所有数据,post-使用 PHP 处理它。 数据操作是 DBMS 最擅长的,因此通常最好将操作留给 DBMS 以提高效率。

第一个是在 'above' 行的最大值中放入一个大得离谱的数字,这样您的简单 'in between min and max' 检查就会起作用。使用 DBMS 本身获取定价水平很简单:

select   pricing_level
  from   pricing_tbl
 where   product_id = '10'
   and   $market_val >= minval
   and   $market_val < maxval

这将为您提供包含正确定价水平的单行。

第二种是在该列中存储 NULL 而不是字符串。可为空的数字列稍作修改后仍可使用:

select   pricing_level
  from   pricing_tbl
 where   product_id = '10'
   and   $market_val >= minval
   and   ($market_val < maxval or maxval is null)

在这两种情况下,您可能希望在呈现或编辑 table 本身时将上部区域(大数字或空值)与单词 above 相互转换。这将使过程看起来相同,即使基础数据已更改。

i have 2 columns namely: Min and Max they are varchar

这是错误的。它应该是整数或至少是十进制值

My query is something like this

这是错误的。您的查询应包含 $marketval 以在数据库端执行所有计算。

here is an instance where the value of Max is above.

这是错误的。任何数字列都不应包含字符串。你可以在那里存储一个大数字。或 NULL,但不是字符串。