之间的操作符在varchar数据类型中无法正常工作

时间:2019-03-08 14:01:06

标签: sql sql-server tsql

setp-1 我下面有一个表tblRouteDetails

enter image description here

步骤2 和 我正在尝试从placeName列中的地方之间查找,但是当我输入下面给出的查询时

setp-3 从tblRouteDetails中选择*,其中placeName在“ Kaushambi”和“ Maholi”之间,它给出enter image description here

setp-4 ,因此它跳过了中间行的记录。但是当我输入时,请从tblRouteDetails中选择*,其中id在1到6之间 enter image description here

它工作正常。但我需要使用placeName

查找地点

3 个答案:

答案 0 :(得分:3)

下面将是一种方法;但这似乎是一个奇怪的要求。如果有人添加的经纬度介于Kaushambi和Maholi之间,则其ID可能更高,但实际上在两者之间。我认为您要考虑的是经/纬度,并寻找距该线+/- x公里之间的任何距离;两者之间。像这样的问题:Algorithm to find all Latitude Longitude locations within a certain distance from a given Lat Lng location

SELECT * 
FROM tblRouteDetails
WHERE ID Between (SELECT ID 
                  FROM tblRouteDetails 
                  WHERE placeName = 'Kaushambi') 
             AND (SELECT ID 
                  FROM tblRouteDetails 
                  WHERE placeName = 'Maholi')
ORDER BY ID 

答案 1 :(得分:1)

您似乎想要:

select rd.*
from tblRouteDetails rd
where rd.id >= (select rd2.id
                from tblRouteDetails rd2
                where placeName = 'Kaushambi'
               ) and
      rd.id <= (select rd2.id
                from tblRouteDetails rd2
                where placeName = 'Maholi'
               );

换句话说,您希望在两个值之间。这不是between所做的。之间是三个操作数的简单比较。

答案 2 :(得分:0)

BETWEEN运算符将根据列placeName的字母顺序从'Kaushambi'和'Maholi'中提取所有结果。我相信您认为您的表是静态的,并且希望它根据初始查询中它们在屏幕上出现的顺序检索结果。那是不对的。

表行存储为无序数据集,并且除非您使用ORDER BY子句,否则将按优化器找到行的顺序返回行。

您可以按placeName来检索行,但是如果这是您要考虑的唯一列,则顺序将是字母顺序。

例如,尝试BETWEEN 'Bareilly' AND 'Hapur'来查看结果集的上半部分(再次按字母顺序),即使按ID排序也没有行。