Sql server 2005 SQL Server 2005 Varchar小于
我在谷歌上搜索了一下,似乎找不到一个好的答案 我有一个带有Sql server 2005 SQL Server 2005 Varchar小于,sql-server-2005,int,varchar,Sql Server 2005,Int,Varchar,我在谷歌上搜索了一下,似乎找不到一个好的答案 我有一个带有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 有人能解释为什么查询1缺少数据吗?还有为什么查询2返回所有数据,但在90数据下方有090?我想这与转换有关,但我找不到任何文档来解释这一
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
有人能解释为什么查询1缺少数据吗?还有为什么查询2返回所有数据,但在90
数据下方有090
?我想这与转换有关,但我找不到任何文档来解释这一点
谢谢。查询2在“90”数据下显示“090”数据,因为这是您告诉它按方面顺序执行的操作 记住,源列是一个VARCHAR。它是一个字符串,尽管是数字,因此将根据字符串规则进行排序。因此,它着眼于顺序的第一个字符,而不是数值 如果希望它根据字符串表示的数值进行排序,则需要在ORDERBY语句中将源列转换为整数 至于它为什么返回所有数据,那是因为你在比较一个数字和一个数字的数字表示。SQL在where子句中执行隐式转换以处理布尔运算符 现在,您报告的查询1的结果不是我所期望的。我希望您只获得8个'090'行,因为这些行将小于字符串'100'(这是我刚刚测试的SQL2012中的结果)
但是为了解决两个查询结果不同的原因,因为您显式地将“100”构建为字符串,所以它将作为字符串执行比较,而不执行任何转换。在字符串比较中,0位于1之前,9之前。当第一个字符足以区分它们进行筛选时,它们是否是数字并不重要。在查询1中,您正在比较2个varchar。比较varchar的规则取决于SQL server的排序规则(默认为SQL\u Latin1\u General\u CP1\u CI\u AS)。检查此项:。这里显示的字符是从最小到最大排序的。 要检查排序规则,请运行ff SQL(注意:更改数据库名称): 对于查询2,由于要比较1 number和1 varchar,因此将强制将数据类型转换为number(正如HABO在评论中所说的) 要测试某些SQL比较,请使用以下SQL:
select
case when
('090'<'100') then 'TRUE'
else 'FALSE'
end
选择
当
(“090”按字母顺序排列数字时,您希望得到什么?0
在9
之前,因此降序排序应将090
放在90
之后。您确定所有字段都不包含空格吗?您可以进行比较:选择case When'090'>'90',然后选择'greater'else'not'结束
第二个query将整数(100)与字符串('090')进行比较,从而强制进行数据类型转换。将数字的描述转换为整数会导致比较行为不同。如果其中一行包含Ten
作为源
您可能不会喜欢结果。Stephen,我很抱歉。我有一个附加值是“0900”。因此查询1实际上返回了“090”还有0900。你的解释现在很有道理。谢谢!
/* 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
select
case when
('090'<'100') then 'TRUE'
else 'FALSE'
end