0

我有一个查询:

$sql = "SELECT * FROM table WHERE  CONCAT(Prod, Serial) BETWEEN '$start' AND '$end'";

其中 Prod 和 Serial 作为字符串存储在 MySQLi 数据库中。我需要更新 AA1000 和 AA1005 之间项目的详细信息。当我运行此查询时,它会更新 AA1000 和 AA1005 之间的单位的详细信息,并且“作为奖励”,所有单位都在 AA10000 和 AA10050 之间。有没有办法使用 BETWEEN 查询获得文本类型字段的完全匹配?

谢谢!

PS 我知道我需要更新查询来更新详细信息。我正在使用 SELECT 进行测试。

4

4 回答 4

1

BETWEEN以非常糟糕的方式滥用语法。你在比较字符串,所以

'AA1000' <= 'AA10000' <= 'AA1005'

实际上是 TRUE,因为您不是在比较数字,而是在比较字符串。字符串比较基于每个字符,不考虑长度,所以

'A' <= 'AZ' <= 'B'

也是如此,即使人类会认为“AZ”出现在“B”之后。

于 2013-07-11T15:37:00.350 回答
0

我从来没有亲自遇到过我需要这个的情况,但我相信你可以使用正则表达式来做到这一点。这可能会对您有所帮助。

于 2013-07-11T15:42:49.830 回答
0

这个查询应该这样做:

SELECT *
FROM TABLE
WHERE Prod = LEFT('$start', 2)
AND CAST(Serial AS DECIMAL) BETWEEN SUBSTRING('$start', 3) AND SUBSTRING('$end', 3);

您还可以在 PHP 中将开始和结束字符串分开:

$prod = substr($start, 0, 2);
$start_code = substr($start, 2);
$end_code = substr($end, 2);

$sql = "SELECT *
FROM TABLE
WHERE Prod = '$prod'
AND CAST(Serial AS DECIMAL) BETWEEN $start_code AND $end_code";
于 2013-07-11T15:43:42.847 回答
0

以下工作到目前为止:

 CONVERT(SUBSTRING('$startunit', 3),UNSIGNED INTEGER) 

感谢大家!

于 2013-07-11T16:02:38.687 回答