Запрос SQL Server приносит несопоставимые данные с фильтром BETWEEN - PullRequest
2 голосов
/ 22 ноября 2010

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

Это мой запрос SQL:

select prdcod
from products
where prdcod between 'F-DH1' and 'F-FMS'
order by prdcod

и результаты этого запроса:

F-DH1
F-DH2
F-DH3
FET-RAZ       <-- What is this value doing here!?
F-FMC
F-FML
F-FMS

Как это нечетное значение может попасть в результаты запроса?

PS: я получаю те же результаты, еслиЯ использую <= и >= вместо between.

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

По запросу ОП выдвигается следующий комментарий к ответу:

Похоже, ваше сопоставление исключает знак "-" - в этом случае результаты имеют смысл, FE находится между FD и FM.

:)

0 голосов
/ 22 ноября 2010

Как насчет добавления AND LEFT(prdcod, 2) = 'F-'?

0 голосов
/ 22 ноября 2010

Попробуйте заменить "-" пробелом, чтобы порядок соответствовал ожидаемому:

DECLARE @list table(word varchar(50))

--create list
INSERT INTO @list
SELECT 'F-DH1'
UNION ALL
SELECT 'F-DH2'
UNION ALL
SELECT 'F-DH3'
UNION ALL
SELECT 'FET-RAZ'
UNION ALL
SELECT 'F-FMC'
UNION ALL
SELECT 'F-FML'
UNION ALL
SELECT 'F-FMS'

--original order
SELECT * FROM @list order by word

--show how order changes
SELECT *,replace(word,'-',' ') FROM @list order by replace(word,'-',' ')

--show between condition
SELECT * FROM @list where replace(word,'-',' ') between 'F DH1' and 'F FMS' 
0 голосов
/ 22 ноября 2010

между и> = и <= в основном используются для числовых операций (включая даты).Вы пытаетесь использовать это для строк, которые в лучшем случае сложно определить, как эти операторы будут интерпретировать каждую строку.</p>

Теперь, хотя я думаю, что понимаю вашу цель здесь, я не совсем уверен, что это возможно с помощью запросов SQL Server.Это может быть некоторая бизнес-логика (благодаря кодам продуктов), которая должна быть реализована в коде.Что-то вроде Entity Framework или Linq-to-SQL может лучше подойти для получения данных, которые вы ищете.

...