Estou consultando uma tabela que possui várias colunas de chave alfanumérica...
KEY1 KEY2 KEY3 ... SOMEDATA SOMEOTHERDATA...
s001
s002
s003 s004 s005
s006
As chaves são o PK de outra mesa em que precisamos nos juntar, o que é irritante, mas não difícil. Mas então eles decidiram fazer isso...
s010-s105
O que significa s010, s011...s015. Existe alguma maneira de fazer uma consulta que quebre isso para que eu possa encontrar uma determinada chave, digamos s013, nessas colunas?
Tudo bem, por favor, não me odeie por esta consulta, porque tenho certeza de que existem maneiras muito melhores de fazer isso (começando corrigindo esse design). Com os dados de exemplo que você postou, essa consulta deve fornecer todas as chaves da tabela original como uma única coluna (
KEY_Unified
):Há um par de suposições embora.
s001-s100
, você não pode ter,s001-s100,s005-s006
por exemplos001
atés999
Se você tiver uma tabela de números, poderá analisar as duas partes do intervalo e juntar-se à sua tabela de números. Então você só precisa formatá-lo de volta para como sua chave de junção está formatada.
demonstração do rextester : http://rextester.com/KAJ77714
retorna:
Referência da tabela de números:
T-SQL - 246 Bytes
Rapido e sujo:
Com a ressalva de que o parsename não vai além de 4 níveis
E eu adiciono mais um...
Combinando parte do código acima junto com alguma manipulação básica de strings, o que fiz foi fazer uma consulta interna que retornou ambos os lados do sinal de menos em dois campos...
Isso retorna algo como...
Em seguida, envolvo isso em outra consulta que usa PATINDEX para separar os números dos numéricos ...
O resultado disso é algo como...
Se alguém tiver uma boa maneira de combinar as duas consultas anteriores em uma, ficaria grato.
A grande vantagem deste exemplo é que a parte TEXT da chave pode ser qualquer coisa, então este método funcionará com "ABC100" e "S10". O truque final é envolver essa consulta em outra que tenha seu WHERE...
A primeira parte puxa a parte numérica da chave que você está procurando e ENTRE isso, mas é claro que isso significa que "A100" e "B100" combinariam. Assim, a segunda parte extrai a parte NÃO numérica e a compara com a parte não numérica da chave no intervalo.
Isso pressupõe que o intervalo sempre será algo como "A100-A999" e não "A100-B100"
Suspeito que existam maneiras de simplificar drasticamente isso em uma consulta de uma ou duas etapas, mas por enquanto está funcionando!