在应使用条件的上下文(在 'ORDER' 附近)中指定了非布尔类型的表达式。

lk0098 2012-02-02 08:57:50
SELECT E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students WHERE E_TID=1
and (CASE WHEN E_Progress<>1 THEN 'E_SID=S_ID'
END) ORDER by E_ID desc

消息 4145,级别 15,状态 1,第 5 行
在应使用条件的上下文(在 'ORDER' 附近)中指定了非布尔类型的表达式。
我用数据库执行上面代码的时候出现错误。请问是怎么回事啊?
...全文
1916 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lk0098 2012-02-02
  • 打赏
  • 举报
回复
我找了下重复项如何消除,找到如下方法:
SELECT DISTINCT E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students
WHERE E_TID=1 and ((E_Progress<>1 and E_SID=S_ID) or E_Progress=1)
ORDER by E_SID desc,E_ID desc

加了DISTINCT 就可了!与大家分享下~
lk0098 2012-02-02
  • 打赏
  • 举报
回复
其实认真想想,貌似19楼那种就是重复了两次了,那么效率也就比较低了....如果有哪位高手有可以一次的方法,更加感谢了
lk0098 2012-02-02
  • 打赏
  • 举报
回复
十分感谢各位!!!今晚让小弟学到不少东西!!!
Vidor 2012-02-02
  • 打赏
  • 举报
回复
哦19楼暴力搞掂了,我也不费心乐。
Vidor 2012-02-02
  • 打赏
  • 举报
回复
费劲,弄点测试数据,关联条件、需求
lk0098 2012-02-02
  • 打赏
  • 举报
回复
十分感谢!!!原来是你了!!
喜阳阳 2012-02-02
  • 打赏
  • 举报
回复
SELECT E_Title,E_ID,E_SID,E_Progress ,(CASE WHEN E_Progress<>1 THEN S_Name END)  S_Name 
FROM Essay,Students WHERE E_TID=1
and E_SID=S_ID
union
SELECT E_Title,E_ID,E_SID,E_Progress ,null
FROM Essay,Students WHERE E_TID=1
and E_SID<>S_ID
ORDER by E_ID desc
lk0098 2012-02-02
  • 打赏
  • 举报
回复
我大概明白了。那么如果是这样的话当我的Essay.E_Progress=1时,E_SID是空的,不能和Students表关联起来,请问怎么办呢?可以通过判断来决定查询那些表吗??谢谢啦~~
lk0098 2012-02-02
  • 打赏
  • 举报
回复
额.......你给那个我懂,谢谢了。
但是我觉得我那个应该没有问题啊,也有表.行名,但是为什么就是重复呢?
Vidor 2012-02-02
  • 打赏
  • 举报
回复
我晕,你拿以下脚本去参详吧

declare @t1 table(id int)
insert @t1 select 1 union all select 2

declare @t2 table(id int)
insert @t2 select 2 union all select 3

select * from @t1
select * from @t2

select * from @t1 a, @t2 b

select * from @t1 a, @t2 b where a.id=b.id



再见
lk0098 2012-02-02
  • 打赏
  • 举报
回复
SELECT E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students
WHERE Essay.E_TID=1 and ((E_Progress<>1 and Essay.E_SID=Students.S_ID) or Essay.E_Progress=1)
ORDER by E_ID desc

......是这样吗??....还是不行哦。。。还是我又理解错了。。。。大侠请指教啊
Vidor 2012-02-02
  • 打赏
  • 举报
回复
回复11楼:

重复问题就是4楼所说的问题了,Essay和Students的关联条件是什么写上

where Essay.?=Students.? and E_TID=1 and ...

没关联就是笛卡尔,Essay*Students
lk0098 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maco_wang 的回复:]

SQL code

--这种就应该不报错了
SELECT
E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students WHERE E_TID=1
--and (CASE WHEN E_Progress<>1 THEN 'E_SID=S_ID' END) 这个……
[/Quote]

十分感谢,我确实是想那样,但是为什么会出现那种符合or E_Progress=1这个条件的数据重复出现??为什么呢?请问怎么消除啊??就像11楼说的。谢谢啦
叶子 2012-02-02
  • 打赏
  • 举报
回复

--这种就应该不报错了
SELECT
E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students WHERE E_TID=1
--and (CASE WHEN E_Progress<>1 THEN 'E_SID=S_ID' END) 这个不是一个条件,这是个值
ORDER by E_ID desc


--如果要加上这个条件,我估计楼主是这个意思
SELECT E_Title,E_ID,E_SID,E_Progress ,
(CASE WHEN E_Progress<>1 THEN S_Name END)
FROM Essay,Students
WHERE E_TID=1 and ((E_Progress<>1 and E_SID=S_ID) or E_Progress=1)
ORDER by E_ID desc
lk0098 2012-02-02
  • 打赏
  • 举报
回复
我明白你那个语句了,是优先级问题。但是我用那个运行还是有问题,因为会造成数据集中有了一次重复,这是为什么啊??就是发生在那个or E_Progress里面的,即如下:

SELECT E_Title,E_ID,E_SID,E_Progress
FROM Essay,Students WHERE E_TID=1
and (E_Progress=1)
ORDER by E_ID desc

这样会造成数据集重复了2次,即一共出现3次。。。。
Vidor 2012-02-02
  • 打赏
  • 举报
回复
回复8楼:

你仔细看6楼的,和你写的不同,我虽然也是菜鸟,逻辑错误还是很少犯的。
Vidor 2012-02-02
  • 打赏
  • 举报
回复
要用case when也应该是这样
and E_SID = (CASE WHEN E_Progress<>1 THEN S_ID else E_SID end)
lk0098 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vidor 的回复:]

引用 5 楼 lk0098 的回复:

引用 4 楼 liangck 的回复:

两个表在where里没有用条件关联起来。


十分感谢你的回答,那么请问应该怎么改呢?我以为(CASE WHEN ... THEN ...)就只是一个像if一样返回的句式呢...我想实现的是当E_Progress<>1时加上条件E_SID=S_ID,否则不加,请问怎么做啊??

SQL code
……
[/Quote]
(E_Progress<>1 or E_Progress=1)??这个不会变成没用吗?....我是想实现根据不同情况用不同的查找方式来查找...
即E_Progress<>1时:SELECT E_Title,E_ID,E_SID,E_Progress ,S_Name
FROM Essay,Students WHERE E_TID=1
and E_SID=S_ID
ORDER by E_ID desc
否则:SELECT E_Title,E_ID,E_SID,E_Progress
FROM Essay,Students WHERE E_TID=1
ORDER by E_ID desc
然后他们的结果放在一个recordset里面。。。。我SQL不太懂,所以想看看怎么实现
Vidor 2012-02-02
  • 打赏
  • 举报
回复
这是逻辑问题,怎么撤到case when了呢
Vidor 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lk0098 的回复:]

引用 4 楼 liangck 的回复:

两个表在where里没有用条件关联起来。


十分感谢你的回答,那么请问应该怎么改呢?我以为(CASE WHEN ... THEN ...)就只是一个像if一样返回的句式呢...我想实现的是当E_Progress<>1时加上条件E_SID=S_ID,否则不加,请问怎么做啊??
[/Quote]
and (E_Progress<>1 and E_SID=S_ID or E_Progress=1)
加载更多回复(5)

34,591

社区成员

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

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