Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 723

/ вопрос открыт /

Здравствуйте, эксперты! Программирую базу данных, но вопрос возник при выборке из таблицы при помощи SQL запроса. Таблицу заполняю другим запросом данными о компьютерах - полный путь по сети (отдел, корпус, серийник и т.д.) и частота процессора (например 600 МГц). Далее нужно сделать выборку для списания по частоте :<500 МГц, больше 500 МГц но меньше 1000 МГц и т.д. Вот именно в этой выборке проблема. Формат записей в таблице "1600 МГц". Перепробовала много чего, но либо вобще ничего не выбирает, либо возвращает все записи. Посоветуйте пожалуйста как справиться. Заранее благодарна.

Евгения Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Евгения (статус: Посетитель)
Вопрос отправлен: 3 мая 2009, 14:50
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 8 мая 2009, 21:53; участников в обсуждении: 5.
Dron

Dron (статус: Студент), 3 мая 2009, 15:11 [#1]:

У вас ошибка в логике. Создавать текстовое поле, в котором хранить "__ МГц" - очень плохой вариант. Работать с текстовыми полями куда сложнее, чем с числами, да и скорость работы с ними существенно меньше. Более того, вы ещё захламляете базу повторяющимся постфиксом "МГц". Решение: сделать для частоты процессора числовое поле, а "МГц" добавлять уже при выводе. Тогда и запрос станет проще: cpu < 500, (cpu > 500) and (cpu < 1000), cpu > 1000.
Нет, можно, конечно, из текста выделять кусок, но это очень нерациональный вариант.
С уважением.
Евгения

Евгения (статус: Посетитель), 3 мая 2009, 15:22 [#2]:

Сори, моя ошибка в постановке вопроса) Дело в том, что эти данные о частоте берутся из существующей таблицы, которую я изменять не могу, т.е поле я беру как есть "__ МГц". Так бы у меня и вопроса не возникло)
Вадим К

Вадим К (статус: Академик), 3 мая 2009, 17:50 [#3]:

Всё зависит от того, какой движок базы данных. В некоторых случаях всё таки можно решить обычным SQL. Итак, варианты решения такие
- найти автора базы, оторвать голову. Самое правильное решение
- Базу копировать себе и конвертировать в свой формат. Вот только если надо редактировать... могут быть проблемы. Хотя кто мешает сделать "двойную запись". Но для больших таблиц и баз это может быть накладно.
- если это Firebird, то там можно написать пользовательскую функцию (UDF так называемый). в результате чего, можно будет в запросе писать что то вида 500 > MyFunc(cpu) и не ломать голову.
- в случае с MSSQL можно написать что то в стиле
'500' > SUBSTR(cpu, 1, CHARINDEX(' ', cpu) - 1)
Но это может не работать - так как может быть добавлен пробел или наоборот убран. и вторая проблема - функция substr возвращает строку. Как число в строку перевести я знаю, а вот наоборот - к сожалению нет.

функция SUBSTR на других базах данных может называться SUBSTRING
Галочка "подтверждения прочтения" - вселенское зло.
Евгения

Евгения (статус: Посетитель), 3 мая 2009, 17:59 [#4]:

Не знаю как применить Ваши советы к себе, ибо база моя состряпана эверестом и находится в формате базы аксесс и с этим я ничего поделать не могу-это дано и изменять нельзя, в том числе и конвертировать. Работаю с базой через АДО, это тоже менять нельзя)
Dron

Dron (статус: Студент), 3 мая 2009, 18:19 [#5]:

Число в строку - можно попробовать CONCAT-ом - должно сработать. Т.е. CONCAT(`numeric_field`).
С уважением.
Вадим К

Вадим К (статус: Академик), 3 мая 2009, 20:07 [#6]:

to Dron. Не надо в строку, это можно. Тут наоборот нужно. Читаем внимательно. А сравнивать строковые представления чисел вместо самих чисел - опасно.
to Евгения
Э.... кто Вам запрещает конвертировать? Ваше нежелание. Просто берите и конвертируйте - сделайте себе копию и работайте на здоровье.
Галочка "подтверждения прочтения" - вселенское зло.
Евгения

Евгения (статус: Посетитель), 3 мая 2009, 20:16 [#7]:

Спасибо за внимание) Но всё-таки конвертировать мне не даёт условие. Нужно напрямую подключаться и работать с аксессовской базой. Которая кстати тоже на входе и выходе должна оставаться в одном и том же состоянии, но с этим я вроде бы справляюсь)
Вадим К

Вадим К (статус: Академик), 3 мая 2009, 20:26 [#8]:

Кто наложил условие?
Конвертировать не означает, что оригинальная база будет изменена. Говоря простым языком - делаем копию, но своем формате. Более того, таблицу можно вообще в памяти держать.
Галочка "подтверждения прочтения" - вселенское зло.
Quark

Quark (статус: 1-ый класс), 3 мая 2009, 22:16 [#9]:

Представился один вариант (не самый изящный, возможно, но...).
Алгоритм следующий:

Вводная: не знаю структуру ваших таблиц, поэтому привожу гипотетический пример. Допустим, у вас есть таблица (назову её "Главная таблица", где находятся поля - полный путь по сети (отдел, корпус, серийник и т.д.) и частота процессора (например 600 МГц).

1. Создаётся промежуточная таблица с тремя полями (можно в памяти, можно и в файле на диске). Одно поле - уникальное (например, ИД записи в Главной таблице или серийник компа, назовём поле "ИД"), другое - частота процессора в строковом варианте ("1600 МГц", назовём его "ЧП-строка"), третье - просто числовое поле (назовём его, например "ЧП-Цифра").

2. Заполняем эту таблицу даными из Главной таблицы (из той, где написано "____ МГц"). Причём выборку делаем только по двум полям (ИД и ЧП-Строка), но не заполняем "ЧП-Цифра".

3. В получившейся промежуточной таблице значение поля "ЧП-строка" каждой записи прогоняем через функцию преобразования строки. Варианты разные есть,главная цель - выдрать из строки цифру и преобразовать её в число (например, StrToInt(s)). Получившуюся в результате обработки цифру добавляем в ту же запись в поле "ЧП-Цифра".

4. Из получившейся промежуточной таблицы выбираем те записи, чьё поле "ЧП-Цифра" соответствует нужным параметрам (<500, >500<1000, >1000). Естественно, одним из полей будет "ИД".

5. Выбираем из основной таблицы те записи, чей "ИД" равен "ИД" выбранных в предыдущем шаге записей.

Вариант громоздкий, но в принципе не сложный. Честно говоря, это первое пришло в голову. Если подумать - возможны наверняка и другие варианты.
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 4 мая 2009, 10:33 [#10]:

Так-с, ну раз тут Access, то должен сработать такой отбор
WHERE StrToInt(cpu)>500
и т.п. И промежуточные таблицы не нужны, единственно, конечно, если вдруг частота части процессоров будет указана не в мегагерцах... Но и тут можно поступить, например, так:

WHERE StrToInt(cpu)>500 AND Right(cpu,3)="МГц"

Пробуйте.
Евгения

Евгения (статус: Посетитель), 8 мая 2009, 21:53 [#11]:

Спасибо за советы, но StrToInt делфи в SQL запросах называет неопознанной. Есть ещё предположения?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.03 сек.