访问数据类型我的SQL代码不匹配

时间:2011-08-19 18:39:15

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

我有一个查询,用于从我的电话系统导入中提取电话分机和某人的全名,并将全名拆分为名字和姓氏。这对于拆分名称非常有用,但如果我尝试按任一名称排序,我会收到Data Tyep Mismatch Error。

这是SQL代码。

SELECT    ExportG3R.Extension,
          Left([ExportG3R.name],InStr([ExportG3R.name],",")-1) AS LastName,
          Trim(Mid([ExportG3R.name],InStr([ExportG3R.name],",")+1,Len([ExportG3R.name])-InStr([ExportG3R.name],","))) AS FirstName
FROM ExportG3R
ORDER BY ExportG3R.Extension;

有关如何使其发挥作用的任何想法?

2 个答案:

答案 0 :(得分:2)

我创建了一个ExportG3R表,其中包含 Extension name 的文本字段。您的查询使用 name 值,例如“Litzner,Mike”。但是,不包含逗号的 name 值(例如“Litzner Mike”)为LastName提供了#Error,为FirstName提供了“Litzner Mike”。如果 name 是Null,它会给我两个#Error。在我尝试对LastName和/或FirstName进行排序之前,这些都不是SELECT的交易破坏者。尝试这些排序时,Access 2003数据库引擎响应“无效的过程调用”,这与您获得的错误消息不同。

所以,虽然我不确定我的情况与你的情况完全匹配,但我建议你尝试使用WHERE子句查询只返回具有非Null name 值的行,并且还包括一个逗号。

SELECT
    e.Extension,
    Left(e.[name],InStr(e.[name],",")-1) AS LastName,
    Trim(Mid(e.[name],InStr(e.[name],",")+1,Len(e.[name])-InStr(e.[name],","))) AS FirstName
FROM ExportG3R AS e
WHERE e.name Like "*,*"
ORDER BY ORDER BY 2,3;

另一个问题是 name 是一个保留字。使用Access 2007在设计视图中创建该表时,向我发出了有关该字段名称的警告。尝试在设计视图中创建一个丢弃表,并在它向您发出有关 name 的警告时阅读它提供的帮助。如果可能,将其更改为不是保留字的内容......也许是FullName。

最后,我认为如果名称字段在表格中分成两个字段,这将更简单。将名称存储为“Last,First”可在一个字段中组合2个属性。因此,当您需要其中任何一个时,您必须将它们分开。单独存储它们更容易,然后在需要时将它们连接为“Last,First”:

SELECT LastName & ", " & FirstName AS FullName

答案 1 :(得分:0)

你可以将它包装在子查询中;

SELECT extension,lastname,firstname
FROM (
    SELECT ExportG3R.Extension, 
    Left([ExportG3R.name],InStr([ExportG3R.name],",")-1) AS LastName,                       
    Trim(Mid([ExportG3R.name],InStr([ExportG3R.name],",")+1, 
        Len([ExportG3R.name])-InStr([ExportG3R.name],","))) AS FirstName
    FROM ExportG3R
) order by firstname