我有两个非常奇怪的问题。
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来运行查询。
答案 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,但不知道哪个是最小的或最大的,则可以使用LEAST
和GREATEST
函数...
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)