比较值是否在数字范围内 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']);
}
}
如果 Min
和 Max
的值始终是数字,这没问题。但是有一个实例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,但不是字符串。
在我的数据库中,我有 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']);
}
}
如果 Min
和 Max
的值始终是数字,这没问题。但是有一个实例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,但不是字符串。