【问题标题】:Avoiding errors on Access name-parsing query避免 Access 名称解析查询错误
【发布时间】:2011-09-26 20:35:17
【问题描述】:

我正在尝试清理旧数据库中的数据,但多年来,FirstName 字段已被中间名和首字母污染。使用简单的 Left-Mid 查询,我可以轻松地将名称拆分为空格。但是当我尝试避免在实际上只有名字的条目上返回 #ERROR 时遇到了问题。

我尝试使用 NULLIF。这个想法是,如果名称中没有空格,则返回 NULL 作为中间名并将整个字符串传递给 FName。

SELECT MID([FirstName], NULLIF(INSTR([FirstName], " "), 0) AS [MName],
LEFT([FirstName], ISNULL(NULLIF(INSTR([FirstName], " "), 0),
LEN([FirstName])) AS [FName]
FROM Persons;

我也尝试使用 IIF 语句 - 如果名称中有空格,则解析它,否则将 MName 返回为 null。

在这两种情况下,Access 都会返回语法错误(缺少运算符)。基本的 Left-Mid 查询独立工作,我可以传递一个 WHERE 来获取有空格的条目。我只是在这里忘记了一些明显的事情吗?

【问题讨论】:

    标签: sql ms-access ms-access-2007


    【解决方案1】:

    这应该可以解决问题:

    SELECT 
        IIF(INSTR(FirstName," ")>0, MID(FirstName, INSTR(FirstName," ")), null) AS MName,
        LEFT(FirstName, IIF(INSTR(FirstName," ")>0, INSTR(FirstName," "), LEN(FirstName))) AS FName
    FROM 
        Persons;
    

    老实说,我从未听说过NULLIF。我只是用谷歌搜索了它,我只找到了 SQL Server 参考。
    你确定它在 MS Access 中可用吗?
    (我必须承认 - 我现在只能在 A2000 上试用,因为这是我在这台机器上安装的唯一版本)

    【讨论】:

    • 抱歉 - 忽略回答您问题的第二部分。我认为 NULLIF 将在 Access 2007 中工作,但我不完全确定。我猜是我在 SQL Server 上之前使用它的时候。
    • IfNull() 存在于其他 SQL 方言中,但不存在于 Jet/ACE/Access 中。
    猜你喜欢
    • 2017-07-16
    • 2011-06-12
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多