ПРАВИЛЬНАЯ функция, не возвращающая ожидаемого? - PullRequest
2 голосов
/ 28 сентября 2010

Запрос:

SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(Sector, 1), StartDate

Глядя на это, запрос должен упорядочить все по секторам с последующей датой начала. Этот запрос работал тихо некоторое время до вчерашнего дня, когда он не упорядочил его должным образом, по какой-то причине Сектор 2 был до Сектора 1.

Тип данных для сектора имеет тип int, а не null. После вставки функции TRIM в сектор она, кажется, работает нормально.

Новый запрос:

SELECT StartDate, EndDate, RIGHT(Sector, 1 )
FROM Table1
ORDER BY Right(TRIM(Sector), 1), StartDate

Что мне показалось действительно странным, поскольку предполагается выделить только один символ, так почему же здесь пробелы?

Есть ли проблема с использованием функции RIGHT в int перед преобразованием типа? Или это что-то еще?

Спасибо за помощь всем!

-Edit- Функция RIGHT должна возвращать 1, 2, 3 или 4, однако при заказе 2 предшествует 1.

Для пояснения, столбец Sector содержит значение типа int, мы можем определить его местоположение, получив последнюю цифру (именно поэтому предыдущий кодер сделал это)

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

Ваши данные хранятся неправильно, если вам нужно отсортировать по подсимволу числового поля.

При этом в определенном контексте функции VBA резервируют пробел в строковых представлениях чисел для знака,Бессмысленным примером этого будет:

  ?Len("12345")
   5 

Обратите внимание на пробел в начале (где - будет, если число, возвращаемое Len () может быть отрицательным).Я думал, что это результат приведения числа к строковому значению, но это не так, и я не смог воспроизвести проблему.Но это, вероятно, будет источником проблемы, и, конечно, обрезка начального пробела решит проблему.

Но это два вызова функций для каждой строки, и затем вы сортируете поэто, и это означает, что индексы не используются, поэтому он будет медленным по сравнению с SORT BY, который может использовать индексы.Итак, я бы пришел к выводу, что у вас есть ошибка схемы, в которой вы придаете смысл части данных, хранящихся в поле.

3 голосов
/ 28 сентября 2010

MS Access 2003 имеет небольшую любопытную особенность (я не могу говорить о других версиях):

  1. Сделайте простой запрос. Сортировать по столбцу A по возрастанию . Сохраните запрос.
  2. Запустите запрос. Когда вы увидите результат, выполните сортировку по столбцу A По убыванию , используя параметр панели инструментов (см. Рис. Ниже). Сохранить и закрыть.
  3. Запустите запрос еще раз. Ваша новая сортировка переопределит сортировку, сохраненную в запросе.

Я думаю, что вы или кто-то еще, вероятно, просто из любопытства открыли запрос, отсортированный по убыванию сектора, и когда вас попросили сохранить изменения в дизайне, вы выбрали Да (хотя технически вы этого не делали). Я нашел самый простой способ восстановить исходную сортировку - отредактировать запрос и сохранить его.

alt text

1 голос
/ 28 сентября 2010

Кажется довольно очевидным, что у вас есть пустое место в конце поля Сектор, которое удаляет обрезка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...