表别名作为条件的问题

cnssk 2008-06-18 10:54:38
select id as aid from test
where aid=1
提示:至少一个参数没有被指定值。
...全文
160 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnssk 2008-06-18
  • 打赏
  • 举报
回复
又一次感受到了Access的不同
cnssk 2008-06-18
  • 打赏
  • 举报
回复
总之问题终于解决了,多谢你想了那么多办法
cnssk 2008-06-18
  • 打赏
  • 举报
回复
DateDiff('d', date(),DateAdd('m', term, createdt)) as days

改成

DateDiff('d', date(),DateAdd('m', iif(isnull(term),0,term), iif(isnull(createdt),0,createdt))) as days
就行了,
感觉Access并没有先解释
where (createDT is not null)
and (term is not null)这样的条件,
如果先解释条件应该就不用在select字段中做空值判断了
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
是WHERE子句有问题,还是DATEDIFF?
cnssk 2008-06-18
  • 打赏
  • 举报
回复
12楼的方法不行,必须弄成14楼那样,因为子查询出来的结果很正常,days,enddate都没有空 值
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
直接对DAYS判断不行吗?
cnssk 2008-06-18
  • 打赏
  • 举报
回复
select * from (select contract.*,
DateAdd('m', term, createdt) as enddate,
DateDiff('d', date(),DateAdd('m', iif(isnull(term),0,term), iif(isnull(createdt),0,createdt))) as days
from contract
where (createDT is not null)
and (term is not null))
where days>30
这样可以了,感觉Access解释SQL语句的顺序真是有问题
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
所以提问先要说明运行环境、记录、正确结果等等。
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
你不是在ACCESS中运行吧,用IIF(ISNULL())代替NZ,简单一点,直接对
DAYS判断

where IIF(ISNULL(days),0,DAYS)>30
cnssk 2008-06-18
  • 打赏
  • 举报
回复
表达式中 'NZ' 函数未定义。
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
OR
where NZ(days,0)>30
OR
where IIF(ISNULL(days),0,DAYS)>30
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
加一个对NULL的判断,NZ OR IIF(ISNULL())
cnssk 2008-06-18
  • 打赏
  • 举报
回复
不带最后那个where条件列出来的记录,createdt,term,enddate,days都没有空记录,也没有错,
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
OR
DateDiff('d', date(),DateAdd('m', term, createdt)) as days
->
DateDiff('d', date(),DateAdd('m', NZ(Term,0), NZ(createdt,0))) as days
cnssk 2008-06-18
  • 打赏
  • 举报
回复
select * from (select contract.*,
DateAdd('m', term, createdt) as enddate,
DateDiff('d', date(),DateAdd('m', term, createdt)) as days
from contract
where (createDT is not null)
and (term is not null))
where days>30
这样试了还是一样的错
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
where (createDT <> null)
and (term <> null)) ->
where createDT IS NOT null AND term IS NOT null

NULL<>NULL
cnssk 2008-06-18
  • 打赏
  • 举报
回复
我原以为是别名不能作为条件,所以做了个测试
cnssk 2008-06-18
  • 打赏
  • 举报
回复
哦,实际上还是刚才的问题,刚才结帖太快了,搞错了,下面的语句还是有问题
select * from (select contract.*,
DateAdd('m', term, createdt) as enddate,
DateDiff('d', date(),DateAdd('m', term, createdt)) as days
from contract
where (createDT <> null)
and (term <> null))
where days>30

contract表中有一条记录CreateDT,TerM均为空值,这一条记录如果存在的话就还是报错

标准表达式中数据类型不匹配。
如果删除这一条记录,则上面的查询正常.
所以我搞不明白,子查询应该已经把空记录过滤掉了,为什么还是不行呢
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
OR
SELECT * FROM (select id as aid from test)
where Aid=1
wwwwb 2008-06-18
  • 打赏
  • 举报
回复
select id as aid from test
where id=1
SQL执行顺序:from ->where->select
在执行WHERE中没有AID列,当然要出问题
OR
SELECT * FROM (select id as aid from test)
where id=1

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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