MySQL引用值和-100值不返回任何结果

时间:2015-06-01 15:05:20

标签: mysql

我有两个非常奇怪的问题。

1)为了使我的查询起作用,至少有一个输入必须在引号中。不是两个,而是至少一个。

2)我可以查询到负99或99.99999999 ...但是一旦值为-100,我就没有结果。

工作查询:

 SELECT * FROM findCities WHERE lon >= '-84' AND lon <= '-99.888888'
 SELECT * FROM findCities WHERE lon >= -84 AND lon <= '-99.888888' 

未返回任何结果:

SELECT * FROM findCities WHERE lon >= -84 AND lon <= -99.888888
SELECT * FROM findCities WHERE lon >= '-84' AND lon <= '-100'

表格结构:

 CREATE TABLE `findCities` (
 `city_id` int(250) NOT NULL AUTO_INCREMENT,
 `state_id` varchar(250) NOT NULL,
 `name` varchar(100) DEFAULT '',
 `zip` int(5) NOT NULL,
 `text` text,
 `lat` varchar(50) NOT NULL,
 `lon` varchar(50) NOT NULL,
 `cityTempID` int(11) DEFAULT '0' COMMENT '0 = default',
 `clinicID` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`city_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=3801 DEFAULT CHARSET=latin1;

似乎不可能重要,但我使用SQLPro来运行查询。

2 个答案:

答案 0 :(得分:1)

您的lon列定义为VARCHAR,因此不等式比较将按字符串逐个字符进行。

看起来您想数字评估。如果您的lon值存储为数字类型会更好。 (我们对纬度和经度列使用DECIMAL(10,6)数据类型。)

鉴于您拥有的内容,要在不更改表格的情况下使其“正常工作”,请将lon列转换/转换为数字。

最快/最简单的方法是向VARCHAR列添加零,例如

SELECT * FROM findCities WHERE lon+0 <= -84 AND lon+0 >= -99.888888
                                  ^^               ^^

此外,您的不平等比较相反,评估lon >= -84 AND lon <= -99永远不会对lon的任何值都成立。您需要交换周围的值,或者交换不等式比较的方向。

使转换更明确:

SELECT *
 FROM findCities 
 WHERE CONVERT(lon,DECIMAL(10,6) <= -84 
   AND CONVERT(lon,DECIMAL(10,6) >= -99.888888

如果您知道作为文字提供的值不是NULL,但不知道哪个是最小的或最大的,则可以使用LEASTGREATEST函数...

SELECT *
 FROM findCities 
 WHERE CONVERT(lon,DECIMAL(10,6) <= GREATEST( -84.000000, -99.88888 ) 
   AND CONVERT(lon,DECIMAL(10,6) >= LEAST(    -84.000000, -99.888888 ) 

请注意,由于转换,MySQL无法在lon列上有效使用范围扫描操作。必须针对表中的每一行评估左侧的表达式。为了获得更好的性能,请将lon列设为数字,然后引用裸列。

答案 1 :(得分:1)

我不知道为什么你不使用十进制字段用于lon和lat字段导致它的纬度和态度

无论如何,您必须在其中子句中使用强制转换程序

cast(lon as decimal(10,6))

SQL Fiddle