[向ALL提问]每日一个小问题 6

claro 2010-08-28 08:57:18
How many rows will this query return?

create table  #temp
(id INT, code nvarchar(2))

insert into #temp
select 1, '0' UNION
select 2, '1' UNION
select 3, '0' UNION
select 4,'22' UNION
select 5,'0'

update #temp set code = '' where code = '0'

select * from #temp where code = 0

drop table #temp



Choose your answer:
0
Error converting the value........
2
3

请您将结果贴在回复中。7日后结贴!

特此申明:SQL入门者建议仔细看题,尝试F5去寻找答案。
入门者,建议不要F5,尝试在大脑中完成思维逻辑。

Good luck!
...全文
551 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 brownhwy 的回复:]
对楼主想说一句:这种题可能会把人引入歧途的。
[/Quote]我想说其实不然,看个人理解和领悟。

开发人员会做下面的错误,这是发生在身边的一件件真实的事情!
目的:判断表a的中的bz字段是否为正确标识(0表示正常标识,1表示不正常标识);
如果是正常标识则取表aa中的正确折扣。

--这是一个很简单的case when判断,我们来看看大家会做什么?

T-SQL
use tempdb
go
create table a (bz char(1),bh varchar(20)) --BZ字段描述是标识,BH字段描述是编号
go
insert into a (bh) values ('085')
insert into a values ('','247') --在数据迁移或者同步过程中让人忽略的关键数据
insert into a values ('0','122')
go

create table aa (zhekou1 real,bh varchar(20)) --zhekou1 字段描述是折扣
go
insert into aa values (0.01,'085')
insert into aa values (0.01,'122')
insert into aa values (0.01,'247')
go


1.可能会写成这样:
--TSQL 1
select case isnull(B.BZ,0)
when '0' then ISNULL(c.zhekou1,其他表的另一个折扣)
when '1' then 0 else 1 end data
from a b
join aa c on b.bh=c.bh


我们来简化一下,看下面的T-SQL
--TSQL 2
select case isnull(BZ,0)
when '0' then 0.1
when '1' then 0 else 1 end data
from a


我们分析在TSQL 2中,when '0'会得到一个1,然后本来它应该有一个正确的折扣是0.1。
如果换成when 0 又会怎样? 就是该帖说的隐式转换问题,select ''转换为int时是0,所以when 0即让''做了转换从而得到正确的折扣0.1 。

这个发生在我们身边的例子,产生的原因有很多,问题是我们能及时发现,在实施前或测试过程中发现,是不容易的,同时也建议规范化编写,从高效率的方式编写是值得提倡的。

注:这样的问题,其实在测试过程中是不容易发现的。对数据的有效测试也是一个宽广的话题。
狼王_ 2010-09-04
  • 打赏
  • 举报
回复

原来如此啊。。。
booby0317 2010-09-04
  • 打赏
  • 举报
回复
受益非常浅
njlywy 2010-09-04
  • 打赏
  • 举报
回复
学习…
彭海涛 2010-09-04
  • 打赏
  • 举报
回复
3行
where code = '0'
where code = 0
对应nvarchar类型来说结果是一样的吧
就是just4 2010-09-04
  • 打赏
  • 举报
回复
SELECT CAST('' AS int)

SELECT CASE WHEN ''=0 THEN 1 ELSE 0 END
brownhwy 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 feilniu 的回复:]
如果表中code字段是varchar或nvarchar:

WHERE code = '0':“=”两边数据类型相同,直接比较。
WHERE code = 0:“=”两边数据类型不同,需要隐式转换。因为int优先级高于varchar或nvarchar,所以这个查询等价于WHERE CAST(code AS int) = 0。这种情况下:无论code字段上有没有索引,都需要表扫描;而且当表中存……
[/Quote]

看了朋友一番话,真的使我受益匪浅。我按照朋友所说的作了测试,真的是这样。虽然我编程时绝对不会出现这样的情况。

对楼主想说一句:这种题可能会把人引入歧途的。


claro 2010-09-04
  • 打赏
  • 举报
回复
明天结贴。
rinoya111 2010-09-03
  • 打赏
  • 举报
回复
受教了,强!
黄_瓜 2010-09-02
  • 打赏
  • 举报
回复
study
hpx021131 2010-09-02
  • 打赏
  • 举报
回复
学习受教
winstonbonaparte 2010-09-02
  • 打赏
  • 举报
回复
拜讀了。還真沒有注意到這樣的轉換。
我看到的時候還以為是返回0或是空的。哎,隱式轉換
fengyun142415 2010-09-02
  • 打赏
  • 举报
回复
学习了
报告楼主 答案是 3
cmhero 2010-09-02
  • 打赏
  • 举报
回复
收益了,感谢LZ
@!
sinpoal 2010-09-02
  • 打赏
  • 举报
回复
学习了~ 不错~
starseeker7 2010-08-30
  • 打赏
  • 举报
回复
0-0
昨天正好拜讀了 feilniu
大作
今天就有這個問題- -,
你們是一夥的吧-0-呵呵
答案當然是3條記錄了cast('' as int )=0
playwarcraft 2010-08-30
  • 打赏
  • 举报
回复
3rows (1,3,5)

友情提醒: 类型转换,人往高处爬。
rinoya111 2010-08-30
  • 打赏
  • 举报
回复
还真想不出来
bancxc 2010-08-30
  • 打赏
  • 举报
回复
这个在2000下会报错
2005下不会报错的 按树哥说的隐士转换了
LVSmile 2010-08-30
  • 打赏
  • 举报
回复
F5得到答案

id code
1
3
5

学习
加载更多回复(31)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧