运算符之间在 varchar 数据类型中无法正常工作 [关闭]

Posted

技术标签:

【中文标题】运算符之间在 varchar 数据类型中无法正常工作 [关闭]【英文标题】:between operator not working properly in varchar data type [closed] 【发布时间】:2019-07-30 13:54:12 【问题描述】:

setp-1 我有一张桌子tblRouteDetails,下面给出了

第二步和 我试图从 placeName 列中查找位置,但是当我输入下面给出的查询时

setp-3 select * from tblRouteDetails where placeName between 'Kaushambi' 和 'Maholi',它给出

setp-4 所以它会跳过中间行的记录。但是当我输入 select * from tblRouteDetails where id 介于 1 和 6 之间时

它工作正常。但我需要使用 placeName 查找地点

【问题讨论】:

请发文字,不要发文字图片。 所以让我们看看... K, L M 你有没有其他以 L.. 开头的 K 的 no...placeNames。没有...任何 M 的 yep 只是 1。结果符合预期。现在,如果您想根据地名的物理纬度/经度而不是该地点的“名称”来进行选择;这是一个不同的查询。 更好地描述“在两者之间寻找位置”的含义可能会有所帮助。如果您将 BETWEEN 应用于 VARCHAR 列,它会按字母顺序排序,但这显然不是您想要的。 每个 individual row 都根据 placeName 条件进行评估,我似乎很清楚 只有第 1 行和第 6 行 是匹配的。 之间不是地理的意思,sql对地球的城市和国家没有了解。 between 主要用于数字或日期。 【参考方案1】:

以下是一种方式;但这似乎是一个奇怪的要求。如果有人添加了介于 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 

【讨论】:

它工作正常,但是当我输入重复记录时,它给出了错误消息 512,级别 16,状态 1,第 3 行子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。 好的。例如:Kaushambi 有 2 个不同的 ID (1, 23),系统应该选择哪个?您可以将 ID 包装在 min() 或 Max() 中,但不知道应该选择哪个 ID,我不确定当存在重复项时要做什么。并注意: between 要求第一个数字小于第二个。如果不是这种情况,您可能需要替换 >= 和 【参考方案2】:

你似乎想要:

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 所做的。之间是三个操作数的简单比较。

【讨论】:

@PeterB。 . .谢谢。 它仅适用于唯一记录,但是当我输入重复记录时,它会给出错误消息 512,级别 16,状态 1,第 3 行子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。【参考方案3】:

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

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

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

尝试BETWEEN 'Bareilly' AND 'Hapur',例如,查看结果集的上半部分(同样,按字母顺序),即使按 ID 排序,它们之间没有行。

【讨论】:

以上是关于运算符之间在 varchar 数据类型中无法正常工作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。

从varchar数据类型到datetime数据类型的转换产生一个超出该范围的值

在sql数据库中,我用聚合函数sum,为啥显示操作数据类型varchar对于sum运算符无效啊?

数据类型 ntext 和 varchar 在not equal to 运算符中不兼容 -九五小庞

数据类型 text 和 varchar 在 equal to 运算符中不兼容。

数据类型 ntext 和 varchar 在 equal to 运算符中不兼容。