0

我用谷歌搜索了一下,似乎找不到一个好的答案......

我有一个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数据?我认为这与转换有关,但我找不到任何解释这一点的文档。

谢谢你。

4

2 回答 2

1

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

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

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

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

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

但是要处理为什么两个查询的结果不同,因为您将“100”显式构建为字符串,它将比较作为字符串执行并且不执行任何转换。在字符串比较中,0 在 1 之前在 9 之前。当第一个字符足以区分它们以进行过滤时,它们并不在乎它们是数字。

于 2013-06-07T03:19:11.153 回答
0

在您的查询 1 中,您正在比较 2 varchar。比较 varchar 的规则取决于您的 SQL 服务器的排序规则(默认为 SQL_Latin1_General_CP1_CI_AS)。检查这个:[SQL_Latin1_General_CP1_CI_AS 排序规则]。那里显示的字符从最小到最大排序。要检查您的排序规则,请运行 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
于 2013-06-07T04:03:01.707 回答