如何在SQL server中的两个varchar字符串之间查找字符串?

如何在SQL server中的两个varchar字符串之间查找字符串?,sql,sql-server,varchar,between,Sql,Sql Server,Varchar,Between,考虑下表,当输入XYZ-00000001和XYZ-00000005之间的任何值时,例如:XYZ-00000003或XYZ-00000004,我应该能够将结果作为“A” 类似地,当输入为XYZ-0000000时,应产生值“B” SELECT [NAME] FROM YourTable WHERE YourValue BETWEEN Val1 AND Val2 使用子字符串和CHARINDEX: DECLARE @tblTest AS Table ( Name VARCHAR(50),

考虑下表,当输入XYZ-00000001和XYZ-00000005之间的任何值时,例如:XYZ-00000003或XYZ-00000004,我应该能够将结果作为“A”

类似地,当输入为XYZ-0000000时,应产生值“B”

SELECT [NAME] FROM YourTable WHERE YourValue BETWEEN Val1 AND Val2

使用子字符串和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))
将@tblTest声明为表
(
名称VARCHAR(50),
VAl1 VARCHAR(50),
VAl2 VARCHAR(50)
)
插入@tblTest值
('A'、'XYZ-00000001'、'XYZ-00000005'),
('B','XYZ-00000006','XYZ-00000012'),
('C','XYZ-00000013','XYZ-00000019'),
('D'、'XYZ-00000020'、'XYZ-00000025')
声明@SerachText VARCHAR(50)='XYZ-00000021'
挑选
*
来自@tblTest
哪里
子串(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText))>=子串(VAl1,CHARINDEX('-',VAl1)+1,LEN(VAl1))
及

子字符串(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText))使用子字符串和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))
将@tblTest声明为表
(
名称VARCHAR(50),
VAl1 VARCHAR(50),
VAl2 VARCHAR(50)
)
插入@tblTest值
('A'、'XYZ-00000001'、'XYZ-00000005'),
('B','XYZ-00000006','XYZ-00000012'),
('C','XYZ-00000013','XYZ-00000019'),
('D'、'XYZ-00000020'、'XYZ-00000025')
声明@SerachText VARCHAR(50)='XYZ-00000021'
挑选
*
来自@tblTest
哪里
子串(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText))>=子串(VAl1,CHARINDEX('-',VAl1)+1,LEN(VAl1))
及

子字符串(@SerachText,CHARINDEX('-',@SerachText)+1,LEN(@SerachText))您可以在字符和数字中分隔列,然后输入值进行比较。下面的代码将为1到5之间的输入数字回答“A”

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

您可以在字符和数字中分隔列,然后输入值进行比较。下面的代码将为1到5之间的输入数字回答“A”

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

单击文本的粗体部分以查看表格。单击文本的粗体部分以查看表格。应该清楚地表明,这是因为
Val1
Val2
的长度固定。它们的字母数字排序正确。一旦固定长度改变,这就不再有效。@Jamiec-你真的确定你在那里说的话吗?可能会使用什么其他排序规则?它将在被要求的意义上工作,排序顺序是字符串排序顺序,对此有明确的规则。必须解释任何其他排序方法。如果长度不同,他们仍然会按照字母数字排序规则进行排序。是的,我确信,这是因为它是固定宽度的。一旦你有一个额外的角色在那里,这将中断。这不会影响您的答案(当然是正确的),但如果他们依赖此答案,而其他人更改了这些列中的数据长度,则可能会影响以后的OP。应该明确指出,这是因为
Val1
Val2
的固定长度。它们的字母数字排序正确。一旦固定长度改变,这就不再有效。@Jamiec-你真的确定你在那里说的话吗?可能会使用什么其他排序规则?它将在被要求的意义上工作,排序顺序是字符串排序顺序,对此有明确的规则。必须解释任何其他排序方法。如果长度不同,他们仍然会按照字母数字排序规则进行排序。是的,我确信,这是因为它是固定宽度的。一旦你有一个额外的角色在那里,这将中断。它不会影响你的答案(这当然是正确的),但如果他们依赖这个答案,而其他人更改了这些列中的数据长度,它可能会影响以后的OP。