Запрос SQL Server приносит несопоставимые данные с фильтром BETWEEN

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

Это мой 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 ответа

Решение

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

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

:)

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

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' 

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

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

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

Другие вопросы по тегам