#sql-server
#sql-сервер
Вопрос:
У меня возникла проблема, с которой я, похоже, не могу разобраться… В принципе, у меня есть форма, в которую пользователь вводит
- стартовая миля
- стартовый двор
- конечная миля
- конечный двор
Я пытаюсь запросить свою базу данных SQL Server, используя значения, которые вводит пользователь… Я могу нормально получить информацию, но мне просто нужна помощь с запросом.
Проблема в том, что данные в базе данных представлены в следующем формате:
ID | mile | yard | gps lat | gps long | rotten | split | wheel_cut | broken | quality |
1, 234, 2342, 35.23143, -123.32423, 1, 2, 1, 2, 2
2, 234, 2954, 35.23143, -123.32423, 1, 2, 1, 2, 2
3, 234, 2994, 35.23143, -123.32423, 1, 2, 1, 2, 2
4, 235, 42, 35.23143, -123.32423, 1, 2, 1, 2, 2
5, 235, 2842, 35.23143, -123.32423, 1, 2, 1, 2, 2
6, 236, 242, 35.23143, -123.32423, 1, 2, 1, 2, 2
7, 236, 2342, 35.23143, -123.32423, 1, 2, 1, 2, 2
8, 237, 282, 35.23143, -123.32423, 1, 2, 1, 2, 2
9, 238, 2342, 35.23143, -123.32423, 1, 2, 1, 2, 2
10, 238, 4342, 35.23143, -123.32423, 1, 2, 1, 2, 2
11, 239, 742, 35.23143, -123.32423, 1, 2, 1, 2, 2
Мне нужно запросить одновременно милю и ярд, поэтому, например, пользователь вводит:
- начальная миля = 234
-
начальный двор = 2954
-
конечная миля = 236
- конечный двор = 2342
Запрос должен выводить идентификаторы 3, 4, 5, 6 и 7.
Если я просто запрошу WHERE mile > 234 AND yard > 2954.
.. Он будет игнорировать идентификатор 4, потому что ярд меньше 2954.
SELECT
id, mile, yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality
FROM
database
WHERE
gps_lat IS NOT NULL
AND (???????)
ORDER BY
mile, yard.
Есть ли кто-нибудь, кто может помочь мне с этим запросом? Приветствуются любые советы!
Надеюсь, я достаточно ясно объяснил ситуацию….
Приветствия,
Neil
Комментарии:
1.Итак, можете ли вы объяснить, почему вы выбрали идентификаторы с 3 по 7 в своих входных параметрах?? На чем вы основываете свое решение, выбирается идентификатор или нет — очевидно, не на двух начальных / конечных значениях, которые вы определяете …. также: почему оно
start yard
больше, чемend yard
в вашем примере?? Так ли это всегда, или это просто образец с совпадением с точки зрения того, как значения соотносятся друг с другом??
Ответ №1:
Я думаю, что проблема вызвана сохранением расстояния в двух столбцах в двух разных форматах.
Можете ли вы сохранить мили в виде десятичной дроби и удалить столбец ярдов?
Если нет, что, если преобразовать столбцы миль и ярдов в футы?
выберите * из YourTable где ((Миля * 5280) (Ярд * 3)) между ((StartMile * 5280) (StartYard 3)) и ((StopMile * 5280) (StopYard * 3))
Комментарии:
1. Спасибо за ваш быстрый ответ datagod! Похоже, это может сработать! Я попробую это сегодня вечером… Приветствия,
Ответ №2:
это не лучший способ, но вы могли бы попробовать преобразовать точки данных о милях в ярды, затем добавить обе точки данных, а затем выбрать между начальным и конечным метражом.
так, например:
declare @startmile int, @endmile int, @startyard int, @endyard int
set @startyard=@startyard (@startmile*1760)
set @endyard=@endyard (@endmile*1760)
select *
from dbo.Table_1
where yard (mile*1760) between @startyard and @endyard
вероятно, есть лучший способ написать это, но я не могу его придумать.
Комментарии:
1. Спасибо DForck42 за ваш ответ! В итоге я использовал вариант вашего кода… Приветствую идею!
Ответ №3:
Спасибо всем, кто откликнулся! В итоге я использовал приведенное ниже… Приветствую Нила
--set values
declare @startmile_int AS int
declare @endmile_int AS int
declare @startyard_int AS int
declare @endyard_int AS int
declare @startyard AS int
declare @endyard AS int
SET @startmile_int=529
SET @endmile_int=535
SET @startyard_int=34
SET @endyard_int=406
--turn miles into yards
set @startyard=@startyard_int (@startmile_int*1760)
set @endyard=@endyard_int (@endmile_int*1760)
SELECT id, mile,yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality
FROM database WHERE gps_lat IS NOT NULL AND yard (mile*1760) between @startyard and @endyard ORDER BY mile, yard
Комментарии:
1. прохладный. теперь единственная реальная проблема заключается в том, что, поскольку вы выполняете преобразование «на лету», вы не сможете получить поиск по индексу с помощью этого запроса. я бы рекомендовал добавить в таблицу столбец, который преобразует мили в ярды и добавляет оба столбца, а затем индексирует их.
Ответ №4:
Если мы избегаем выполнения вычислений, оптимизатор может использовать индекс, и запрос может выполняться быстрее.
WHERE (mile > @startMile OR mile = @startMile AND yard >= @startYard)
AND (mile < @endMile OR mile = @endMile AND yard <= @endYard)
Комментарии:
1. Спасибо за ваш быстрый ответ, Энтони Фаулл!