Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005 Varchar小于_Sql Server 2005_Int_Varchar - Fatal编程技术网

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