SQL服务器为varchar比较返回错误的结果

时间:2014-10-26 06:02:42

标签: sql-server

太棒了。一切看起来都不错,但SQL Server为varchar比较返回了错误的结果。

以下是我通过的命令,但每个命令的结果都是矛盾的。

很抱歉给您带来不便。堆栈溢出不允许我添加图像。

 select * from book_loans

 select max(loan_no) as max_number from book_loans

 select * from book_loans where loan_no = '12'

以下是表格和结果:

book_loans (first query result):

loan_no book_id branch_id   card_no date_out    due_date    date_in
1   0399147020  1   9019    2013-11-22  2013-12-06  2013-12-01
10  0192860925  4   9009    2014-04-18  2014-05-02  NULL
11  0805057579  1   9021    2014-04-18  2014-05-02  NULL
12  0911625607  2   9018    2014-04-19  2014-05-03  NULL
2   0030059380  4   9007    2013-12-01  2013-12-15  2013-12-16
3   0671880756  5   9018    2013-12-08  2013-12-22  2013-12-22
4   0911625291  3   9013    2014-01-02  2014-01-16  2014-01-12
5   0688161995  5   9022    2014-02-10  2014-02-24  2014-03-01
6   0911625291  2   9011    2014-03-03  2014-03-17  2014-03-16
7   1861003730  3   9034    2014-04-17  2014-05-01  NULL
8   0201612585  3   9034    2014-04-17  2014-05-01  NULL
9   1565927699  3   9034    2014-04-17  2014-05-01  NULL

第二个查询结果:

max_number
9

第三个查询结果:

result is empty

1 个答案:

答案 0 :(得分:0)

因为您将其存储为varchar。可以在值之前存储empty space。所以像其他人说的那样你需要转换为int然后进行比较或聚合你想要的东西。

检查这个

CREATE TABLE #t
  (a VARCHAR(10))

INSERT INTO #t
VALUES      (' 12')

SELECT *
FROM   #t
WHERE  a = '12' 

此处不会返回任何行。

SELECT *
FROM   #t
WHERE  convert(int,a) = '12' 

此处将返回1行。

因此,如果一个字段将保存一个数值,那么它应该始终是数字类型(int,bigint,numeric,decial等等。)