SQL Server 2005 Varchar小于

时间:2013-06-07 02:52:47

标签: sql-server-2005 int varchar

我用Google搜索了一下,似乎无法找到一个好的答案......

我有一个包含varchar(4)列的表格,其中包含41行90和8行090

查询1 将返回9行,8行90,1行090

SELECT * 
FROM WorkArea..BSNOB_ServiceSalesParts_Testing
WHERE Source < '100'
ORDER BY Source DESC

查询2 将返回所有49行,但包含090的行位于结果的底部。

SELECT * 
FROM WorkArea..BSNOB_ServiceSalesParts_Testing
WHERE Source < 100
ORDER BY Source DESC

有人可以向我解释为什么查询1缺少数据吗?此外,为什么查询2会返回所有数据,但090数据低于90?我认为这与转换有关,但我找不到任何解释这个的文档。

谢谢。

2 个答案:

答案 0 :(得分:1)

查询2显示“90”数据下面的“090”数据,因为这是您在ORDER BY方面要做的事情。

请记住,您的SOURCE列是VARCHAR。这是一个字符串,尽管是数字,因此将根据字符串的规则排序。因此,它会查看订单的第一个字符,而不是数值。

如果您希望它根据字符串表示的数值进行排序,那么您需要将SOURCE列转换为ORDER BY语句中的整数。

至于为什么它返回所有数据,那是因为你要将数字的数字表示与数字进行比较。 SQL在where子句中执行隐式转换以处理布尔运算符。

现在,您查询的查询结果不是我所期望的。我期望你只获得8'090'行,因为那些行将小于字符串'100'(这是我刚刚测试的SQL2012中的结果)。

但是为了解决为什么两个查询的结果不同,因为你明确地将'100'作为字符串构建,它以字符串形式执行比较并且不执行任何转换。在字符串比较中,在9之前出现0。当第一个字符区分它们足以进行过滤时,它并不关心它们是数字。

答案 1 :(得分:0)

在您的查询1上,您正在比较2 varchar。比较varchar的规则取决于SQL Server的排序规则(默认为SQL_Latin1_General_CP1_CI_AS)。检查一下: [SQL_Latin1_General_CP1_CI_AS collation sorting]。这里显示的字符从最小到最大排序。 要检查排序规则,请运行ff SQL(注意:更改数据库名称):

/* Identify Collation for a SQL Server database */
DECLARE @DatabaseName as SYSNAME
SET @DatabaseName = 'MYDB'  /* Replace Database Name Here....*/
SELECT 
 DB_NAME(DB_ID(@DatabaseName)) AS DatabaseName
,DATABASEPROPERTYEX(@DatabaseName, 'Collation') AS CollationUsedBySQLServerDatabase
GO

对于您的查询2,由于您要比较1个数字和1个varchar,因此它将强制将数据类型转换为数字(正如HABO在评论中所述)。

要测试一些SQL比较,请使用此SQL:

select 
case when 
('090'<'100') then 'TRUE'
else 'FALSE'
end