Запрос 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 может лучше подойти для получения данных, которые вы ищете.