2016-09-21 4 views
0

Рассмотрим таблицу ниже, я должен быть в состоянии получить результат как «А», если ввести любое значение между XYZ-00000001 и XYZ-00000005 для например: XYZ-00000003 или XYZ-00000004Как найти строку между двумя строками varchar на SQL-сервере?

аналогично, когда входной сигнал задается как XYZ Значение -00000008 «B» должно быть приведено.

Table

+0

Нажмите на полужирную часть текста, чтобы увидеть таблицу. –

ответ

0

Вы можете отделить столбцы символов и цифр, а затем введите значение для сравнения. Ниже код ответит «A» на номер ввода от 1 до 5.

SELECT NAME 
FROM 
(
select *, left(val1,3) VAL1_ALFA, left(val2,3) VAL2_ALFA, 
cast(REPLACE(val1, SUBSTRING(val1, PATINDEX('%[a-z]%', val1), 4),'') as int) val1_NUM, 
cast(REPLACE(val2, SUBSTRING(val2, PATINDEX('%[a-z]%', val2), 4),'') as int) val2_NUM from Your_Table 
) A 
WHERE 
4 BETWEEN val1_NUM AND VAL2_NUM 
2
SELECT [NAME] FROM YourTable WHERE YourValue BETWEEN Val1 AND Val2 
+1

Возможно, должно быть ясно, что это работает из-за фиксированной длины 'Val1' и' Val2'. Они буквенно-цифровым образом сортируются правильно. Как только эта фиксированная длина изменится, это больше не работает. – Jamiec

+0

@Jamiec - ты действительно уверен в том, что ты там сказал? Какое другое правило сортировки можно использовать? Это будет работать в смысле того, что было задано, порядок сортировки - порядок упорядочения строк, для которого существуют четкие правила. Любой другой метод сопоставления должен быть объяснен. Если длина была изменена, тогда они все еще будут сортироваться в соответствии с алфавитно-цифровыми правилами сортировки. – Cato

+0

Да, конечно, это работает благодаря тому, что это фиксированная ширина. Как только у вас есть дополнительный персонаж, это ломается. Это не влияет на ваш ответ (что, конечно, правильно), но может повлиять на OP в будущем, если они полагаются на этот ответ, а кто-то другой изменяет длину данных в этих столбцах. – Jamiec

0

Использование SUBSTRING И CHARINDEX:

DECLARE @tblTest AS Table 
(
    Name VARCHAR(50), 
    VAl1 VARCHAR(50), 
    VAl2 VARCHAR(50) 
) 

INSERT INTO @tblTest VALUES 
('A','XYZ-00000001','XYZ-00000005'), 
('B','XYZ-00000006','XYZ-00000012'), 
('C','XYZ-00000013','XYZ-00000019'), 
('D','XYZ-00000020','XYZ-00000025') 


DECLARE @SerachText VARCHAR(50)='XYZ-00000021' 

SELECT 
    * 
FROM @tblTest 
WHERE 
    SUBSTRING(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText)) >=SUBSTRING(VAl1,CHARINDEX('-',VAl1)+1,LEN(VAl1)) 
    AND 
    SUBSTRING(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText)) <=SUBSTRING(VAl2,CHARINDEX('-',VAl2)+1,LEN(VAl2)) 
Смежные вопросы