我在旧的msaccess查询中有一个where子句,我将其转换为SQL Server。只是想对此有所了解。
此Access Query中的where子句对SQL Server无效。
这是Access Where语句......
WHERE (((MyTable.MYField) <> IsNull([MYField])))
有没有人有一个很好的替代... MyTable.MYField是一个整数值,MS Access中的Isnull返回一个布尔值true或false值,但这种语法对SQL Server不正确,我尝试了一些这样的排列无济于事。抱歉,无法提供数据或真实字段名称....
我理解链接表和什么不是,但数百万行不是一个好的解决方案......
任何关于此的人?
答案 0 :(得分:1)
如果您正在尝试过滤掉MyField具有NULL值的记录时,我正确理解原始查询的意图,则需要使用IS NOT NULL构造。
WHERE MyTable.MyField IS NOT NULL
答案 1 :(得分:1)
这是一个非常奇怪的where
子句。我很好奇,所以做了一些调查...... TLDR的结论是该条款相当于:
where MyField <> 0
我在MS Access 2013中创建了下表:
TestTable
---------
ID autonumber,
MyField number
并填写如下
ID | MyField
------------
1 | -1
2 | 0
3 | 1
4 | NULL
然后我写了以下查询,
SELECT
TestTable.ID,
TestTable.MyField,
TestTable.MyField AS MyFieldAsTrueFalse,
IsNull([MyField]) AS IsNullAsTrueFalse,
IsNull([MyField]) AS IsNullAsInt
FROM
TestTable;
“格式化”为别名的最后三个字段建议在查询的设计视图中使用“属性”。这将返回以下数据集:
ID | MyField | MyFieldAsTrueFalse | IsNullAsTrueFalse | IsNullAsInt
-------------------------------------------------------------------
1 | -1 | TRUE | FALSE | 0
2 | 0 | FALSE | FALSE | 0
3 | 1 | TRUE | FALSE | 0
4 | NULL | NULL | TRUE | -1
在查询中添加了where子句(TestTable.MyField<>IsNull([MyField])
)后,我只看到ID为1和3的行。
所以,我认为MS Access正在做的是将MyField中的数字字段转换为布尔值。它的方式是除了零以外的任何东西变成TRUE
。但是,NULL
仍为NULL
。因此,在评估where子句时,它正在执行以下操作:
伪代码
case
when MyField is NULL then NULL
when MyField = 0 then FALSE
else TRUE
end
伪代码
case
when MyField is NULL then TRUE
else FALSE
end
如果你遵循这个,我认为where子句相当于:
where MyField <> 0
这将过滤掉空值和零,在MS Access中提供相同的结果,显然会毫无怨言地转换为SQL-Server。