2016-09-21 7 views
0

traiterai table, je devrais être en mesure d'obtenir le résultat en « A » lorsque l'entrée une valeur comprise entre XYZ-00000001 et XYZ-00000005 pour par exemple: XYZ-00000003 ou XYZ-00000004Comment trouver une chaîne entre deux chaînes varchar dans SQL Server?

De même lorsque l'entrée est donnée comme XYZ -00000008 la valeur "B" devrait être obtenue.

Table

+0

Cliquez sur la partie BOLD du texte pour voir la table. –

Répondre

0

Vous pouvez séparer les colonnes en caractères et de chiffres, puis entrez la valeur de comparaison. Le code ci-dessous répondra 'A' pour le nombre entré entre 1 et 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

Devrait probablement faire comprendre que cela fonctionne en raison de la longueur fixe de 'Val1' &' Val2'. Ils trient correctement les caractères alphanumériques. Dès que cette longueur fixe change, cela ne fonctionne plus. – Jamiec

+0

@Jamiec - êtes-vous vraiment sûr de ce que vous avez dit là-bas? Quelle autre règle de tri pourrait être utilisée? Cela fonctionnerait dans le sens de ce qui a été demandé, l'ordre de tri est l'ordre de classement des chaînes, pour lequel il existe des règles claires. Toute autre méthode de collation devrait être expliquée. Si la longueur était variée, ils trieraient toujours selon les règles de tri alphanumériques. – Cato

+0

Oui Im sûr, cela fonctionne en vertu de sa largeur fixe. Dès que vous avez un personnage supplémentaire là-dedans, cela casse. Cela n'affecte pas votre réponse (ce qui est bien sûr correct), mais cela peut affecter le PO à l'avenir s'il dépend de cette réponse et si quelqu'un d'autre modifie la longueur des données dans ces colonnes. – Jamiec

0

utilisation SUBSTRING ET 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))