Доступ к несоответствию типов данных в моем коде SQL - PullRequest
0 голосов
/ 19 августа 2011

У меня есть запрос, который извлекает добавочный номер телефона и полное имя человека из импорта из моей телефонной системы и разделяет полное имя на имя и фамилию. Это прекрасно работает для разделения имени, но если я пытаюсь выполнить сортировку по любому имени, я получаю ошибку несоответствия типов данных.

Вот код 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 ]

2 голосов
/ 20 августа 2011

Я создал таблицу ExportG3R с текстовыми полями для Расширение и имя . Ваш запрос работал с name значениями типа "Litzner, Mike". Однако значение name , которое не включает запятую, такое как «Litzner Mike», дало мне #Error для LastName и «Litzner Mike» для FirstName. И если name равно Null, это дает мне #Error для обоих. Ни один из них не был прерывателем сделки для SELECT, пока я не попытался отсортировать по LastName и / или FirstName. При попытке выполнить такие сортировки обработчик базы данных Access 2003 ответил «Недопустимый вызов процедуры», что не является тем же сообщением об ошибке, которое вы получаете.

Итак, хотя я не уверен, что моя ситуация в точности совпадает с вашей, я предлагаю вам попробовать запрос с предложением WHERE, чтобы получить только те строки, которые имеют ненулевые значения 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;

Другая проблема заключается в том, что имя является зарезервированным словом. При создании этой таблицы в режиме конструктора с помощью Access 2007 выдается предупреждение об имени этого поля. Попробуйте создать одноразовую таблицу в представлении «Дизайн» и прочитайте справку, которую он предлагает, когда он предупреждает о name . Если это вообще возможно, замените его на что-то, что не является зарезервированным словом ... Возможно, FullName.

Наконец, я думаю, что было бы проще, если бы поле имени было разделено на два поля в самой таблице. Хранение имен как «Last, First» объединяет 2 атрибута в одном поле. Поэтому, когда вам нужен любой из них, вы должны разделить их. Их проще хранить отдельно, а затем объединять, когда они вам нужны, как «Last, First»:

SELECT LastName & ", " & FirstName AS FullName
0 голосов
/ 20 августа 2011

вы можете заключить его в подзапрос;

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
...