Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paginad

Busca no Sql Server

Recommended Posts

Opa, beleza... Tenho a seguinte dúvida.

 

Em uma tabela capitulos, tenho os registros:

 

capitulo | numero

teste1 | 1

teste2 | 2-3

teste3 | 4

teste4 | 5

 

Esse campo numero do capitulo é text, como eu faço para buscar o capitulo 2 sendo que tem um traço, sendo 2-3? Tipo se o usuário buscar por 2 ou 3 tem que vir a linha teste2, capitulo 2-3

 

Valeu, agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, inicialmente vou te dizendo que essa forma de armazenar os dados não está normalizada. O correto nesse caso seriam duas tabelas, você está quebrando a Primeira Forma Normal. As consultas ficariam mais simples utilizando duas tabela ;)

 

Se deseja, mesmo assim, usar esse esquema doido, pode fazer uma consulta assim:

 

select * from capitulos where numero like '%-2' or numero like '2-%' or numero = 2 or numero like '%-2-%'

De qualquer forma, isso só funcionaria em um campo varchar, não em um text. Com um campo text ficaria mais bizarro ainda:

 

select * from capitulos where convert(varchar,numero) like '%-2' or convert(varchar,numero) like '2-%' or convert(varchar,numero) = 2 or convert(varchar,numero) like '%-2-%'

Isso provavelmente tornaria sua consulta muito lenta e o sistema totalmente desajeitado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo retorno. Essa tabela com contem esses registros, foi heradada, tem cerca de uns 90 mil registros e apenas 250 que contem traço.

 

Como sugere a criação de uma tabela extra para eu encontrar esses registros? Como ficariam os campos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estrutura das tabelas:

 

CREATE TABLE capitulos (id INT, nome VARCHAR(100));
CREATE TABLE capitulos_numeros (id_capitulo INT, numero SMALLINT);

Exemplos de dados:

 

INSERT INTO capitulos (1, 'teste1');
INSERT INTO capitulos_numeros (1, 1);

INSERT INTO capitulos (2, 'teste2');
INSERT INTO capitulos_numeros (2, 2);
INSERT INTO capitulos_numeros (2, 3);

INSERT INTO capitulos (3, 'teste4');
INSERT INTO capitulos_numeros (3, 4);

INSERT INTO capitulos (4, 'teste1');
INSERT INTO capitulos_numeros (4, 5);

Exemplo de consulta:

 

select * from capitulos, capitulos_numeros where capitulos_numeros.id_capitulo = capitulos.id and capitulos_numeros.numero = 2

No entanto, se é uma tabela herdada, você terá um certo trabalho pra migrar esses 250 registros com traço. Provavelmente será manual, ou com um cursor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso eu deixe como está, como eu poderia ordenar esse campo que tem o conteudo numerico, mais com tipo varchar?

 

Sei que posso dar um CInt ou Conver, mais no meio dos registros, tem 2-3, ai nao vai dar. Pensei em dar um Left e pegar tudo que tem antes do traco, mais nao deu certo.

 

O que acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você vai ter que usar o CHARINDEX pra achar o primeiro traço, SUBSTRING pra cortar a string do começo ao primeiro traço e então utilizar esse valor pra ordenar. Gambiarra total...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja só eu to fazendo isso. Ele ta cortanto até o traço, mais os que nao tem traço ele tb ta cortando, ou seja ta vindo NULL nos demais registros.

 

Convert(INT,Left(numero,NULLIF(charindex('-',versiculo)numero-1,-1)))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi esse seu código, o que seria "versiculo"? Imaginei algo assim:

 

CONVERT(INT, ISNULL(LEFT(numero, charindex('-', numero)-1), numero))

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.