запрашиваем данные, в которых 2 столбца с номерами

#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. Спасибо за ваш быстрый ответ, Энтони Фаулл!