MS ACcess到SQL Server Where子句转换

时间:2017-03-30 17:29:56

标签: sql sql-server ms-access

我在旧的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不正确,我尝试了一些这样的排列无济于事。抱歉,无法提供数据或真实字段名称....

我理解链接表和什么不是,但数百万行不是一个好的解决方案......

任何关于此的人?

2 个答案:

答案 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子句时,它正在执行以下操作:

LHS:MyField [为TRUE / FALSE / NULL]

伪代码

case
    when MyField is NULL then NULL
    when MyField = 0 then FALSE
    else TRUE
end

RHS:isnull(MyField)[为TRUE / FALSE]

伪代码

case
    when MyField is NULL then TRUE
    else FALSE
end

如果你遵循这个,我认为where子句相当于:

where MyField <> 0 

这将过滤掉空值和零,在MS Access中提供相同的结果,显然会毫无怨言地转换为SQL-Server。