AJUDA COM SELECT (INTEIRO ENTRE DOIS CAMPOS)

 Tópico anterior Próximo tópico Novo tópico

AJUDA COM SELECT (INTEIRO ENTRE DOIS CAMPOS)

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#490356 - 06/09/2019 17:51:07

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


Fox

Obrigado pela resposta, primeiramente, mas discordo quanto a estrutura.
Eu tenho que ter algo que seja generico e especializado ao mesmo tempo, nos exemplos que voce passou acima ficaram muito []hardcode[] os ranges.
Eu ja tentei fazer o regresso para uma range a menos (algo como valor - 100) para ver se resolvo por exemplo o range 324 mesmo assim nao deu certo.
Nao considero sinceramente que minha estrutura esteja errada...pensei ate em colocar um valor e dar between mas nao rola pois eu traria ranges indesejados.

Vamos ver se alguem tem alguma luz

Vera Lucia


#490357 - 06/09/2019 19:23:54

OCELOT
SOROCABA
Cadast. em:Março/2012


Última edição em 06/09/2019 19:24:44 por OCELOT

Citação:
:
Ocelot

Por favor da uma olhada nesse link e brinca um pouco, voce vai ver que o 408 at vai funcionar, mas se tentar com 508 por exemplo j no rola pois ele trs []aquele[] range e no os ranges at ele (com 508, deveria trazer 400 tambm).

Select * from newtable where ((vmin = 1 and vmax = 999999) or  (vmin > 1 and 408 between vmin and vmax));


http://sqlfiddle.com/#!9/43d802/10

A resposta que dei filtra de acordo com os ranges, mas pelo que entendi agora vi que voc no quer ranges e acho que est complicando demais a lgica

Voc ter um range mnimo e mximo faz sentido apenas se a partir de um certo valor voc quer excluir opes anteriores, por exemplo no sqlfiddle que voc passou, s faz sentido desta forma se voc quer que o valor 580 traga os itens 1, 2, 3 e 5, excluindo o 4, mas se o que voc quer que sempre traga todos os itens anteriores tudo que voc precisa do valor mnimo

Select * from newtable where vmin <= 580


Desta forma voc trs todos os 1, 2, 3,4 e 5, se o valor for menor que 400 ele trs do 1 ao 3, se for menor que 500 do 1 ao 4

Voc s precisa do valor mximo se quiser excluir uma opo dependendo do range, o que no faz muito sentido




#490362 - 08/09/2019 21:10:11

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


Depois de bater muita cabea, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range valido para qualquer situao cheguei nisto:

http://sqlfiddle.com/#!9/3b65312/36

Vera Lucia


#490363 - 09/09/2019 00:49:29

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 09/09/2019 01:00:21 por JABA

Faa assim:

CREATE TABLE newtable (
    nump INT NULL,
    vmin INT DEFAULT NULL NULL,
    vmax INT DEFAULT NULL NULL
);


INSERT INTO newtable (nump, vmin, vmax) VALUES(1, 1, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(2, 1, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(3, 200, 299);
INSERT INTO newtable (nump, vmin, vmax) VALUES(4, 300, 399);
INSERT INTO newtable (nump, vmin, vmax) VALUES(5, 400, 499);



Select  nump from newtable  where  (vmin <= 508 and vmax >= 508);


Ser retornado o primeiro e o segundo, como o esperado. Alm do mais, testei com todos os critrios que voc postou e funcionou perfeitamente.


_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#490364 - 09/09/2019 07:58:35

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
Depois de bater muita cabea, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range valido para qualquer situao cheguei nisto:

http://sqlfiddle.com/#!9/3b65312/36

Citação:
Vera, no sei como foi formado a estrutura de dados, mas da forma que est, est completamente errado.

Veja bem :

Vc tem tres registros absolutamente iguais, para indices diferentes(onde o correto seria apenas um registro, ou um group by).
Vc tem um registro minimo e um mximo maior que outros registros que esto entre esse intervalo.

Eu no faria dessa forma , mas ve se te ajuda.....



Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#490365 - 09/09/2019 11:08:24

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


@JABA

Realmente no to simples o raciocinio como vocs expos, se voc analizar o fiddle que coloquei ver que no se trata de um simples between.

Vera Lucia


#490366 - 09/09/2019 16:31:24

OCELOT
SOROCABA
Cadast. em:Março/2012


Última edição em 09/09/2019 16:32:57 por OCELOT

Me desculpe se parecer grosso mas no sei se est realmente difcil de resolver isso ou se voc no quer aceitar respostas que no sejam do jeito que voc espera, porque est at difcil de entender o resultado que voc espera

Ento vamos colocar desta forma, eu consigo imaginar duas situaes apenas com estes dados
INSERT INTO newtable (nump, vmin, vmax) VALUES(1, 1, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(2, 200, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(3, 300, 399);
INSERT INTO newtable (nump, vmin, vmax) VALUES(4, 400, 499);
INSERT INTO newtable (nump, vmin, vmax) VALUES(5, 500, 599);


Na primeira situao seria que dado um valor eu quero trazer todos registros em que o valor informado est entre vmin e vmax e somente estes, por exemplo passando o valor 480 ele deve retornar os valores 1, 2 e 4, excluindo o 3 e 5 pois eles no satisfazem o critrio

A minha primeira resposta resolveria isto, s pra constar tinha um erro em um valor que tinha me passado despercebido mas corrigi agora, e ela praticamente a mesma resposta do JABBA logo acima.
SELECT nump FROM newtable  WHERE vmin <= 480 and vmax >= 480;


Aqui importante ressaltar que praticamente em todos os fiddles que voc postou voc invertia o operador para comparao com o mnimo e mximo, e mesmo tendo falado na minha primeira resposta isso parece que voc ignorou completamente e continuou fazendo errado.

A segunda situao que dado um valor eu quero trazer todos os registros em que o valor informado est entre vmin e vmax e tambm todos os registros anteriores, por exemplo o valor 480 deve retornar os valores 1, 2, 3 e 4, excluindo apenas o 5

Neste caso existe um erro de lgica pois voc no precisa de valor mximo, s de mnimo, com os dois no tem como fazer, e essa a soluo que dei em minha segunda resposta mas que parece tambm ter sido ignorada completamente, sendo que o simples select como este trs estes resultados
SELECT nump from newtable WHERE vmin <= 480


Se nada disso te servir ento voc precisa dar exemplos melhores de dados da tabela e qual resultado era o esperado dado certo valor, e eu digo exemplos no plural, pois com um exemplo s pode ser que uma resposta funcione em um caso e no em outro




Resposta escolhida #490367 - 09/09/2019 16:45:38

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
Me desculpe se parecer grosso mas no sei se est realmente difcil de resolver isso ou se voc no quer aceitar respostas que no sejam do jeito que voc espera, porque est at difcil de entender o resultado que voc espera

Ento vamos colocar desta forma, eu consigo imaginar duas situaes apenas com estes dados
INSERT INTO newtable (nump, vmin, vmax) VALUES(1, 1, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(2, 200, 999999);
INSERT INTO newtable (nump, vmin, vmax) VALUES(3, 300, 399);
INSERT INTO newtable (nump, vmin, vmax) VALUES(4, 400, 499);
INSERT INTO newtable (nump, vmin, vmax) VALUES(5, 500, 599);


Na primeira situao seria que dado um valor eu quero trazer todos registros em que o valor informado est entre vmin e vmax e somente estes, por exemplo passando o valor 480 ele deve retornar os valores 1, 2 e 4, excluindo o 3 e 5 pois eles no satisfazem o critrio

A minha primeira resposta resolveria isto, s pra constar tinha um erro em um valor que tinha me passado despercebido mas corrigi agora, e ela praticamente a mesma resposta do JABBA logo acima.
SELECT nump FROM newtable  WHERE vmin <= 480 and vmax >= 480;


Aqui importante ressaltar que praticamente em todos os fiddles que voc postou voc invertia o operador para comparao com o mnimo e mximo, e mesmo tendo falado na minha primeira resposta isso parece que voc ignorou completamente e continuou fazendo errado.

A segunda situao que dado um valor eu quero trazer todos os registros em que o valor informado est entre vmin e vmax e tambm todos os registros anteriores, por exemplo o valor 480 deve retornar os valores 1, 2, 3 e 4, excluindo apenas o 5

Neste caso existe um erro de lgica pois voc no precisa de valor mximo, s de mnimo, com os dois no tem como fazer, e essa a soluo que dei em minha segunda resposta mas que parece tambm ter sido ignorada completamente, sendo que o simples select como este trs estes resultados
SELECT nump from newtable WHERE vmin <= 480


Se nada disso te servir ento voc precisa dar exemplos melhores de dados da tabela e qual resultado era o esperado dado certo valor, e eu digo exemplos no plural, pois com um exemplo s pode ser que uma resposta funcione em um caso e no em outro


Pois , na minha primeira resposta j havia dito que h erro na lgica.
A resposta foi :

Citação:
:
Fox

Obrigado pela resposta, primeiramente, mas discordo quanto a estrutura.
Eu tenho que ter algo que seja generico e especializado ao mesmo tempo, nos exemplos que voce passou acima ficaram muito []hardcode[] os ranges.
Eu ja tentei fazer o regresso para uma range a menos (algo como valor - 100) para ver se resolvo por exemplo o range 324 mesmo assim nao deu certo.
Nao considero sinceramente que minha estrutura esteja errada...pensei ate em colocar um valor e dar between mas nao rola pois eu traria ranges indesejados.

Vamos ver se alguem tem alguma luz


A segunda resposta :


Citação:
:
Depois de bater muita cabea, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range valido para qualquer situao cheguei nisto:

http://sqlfiddle.com/#!9/3b65312/36


Sendo que postei uma soluo que retornou os resultados desejados em todas as situaes...(MESMO EU DISCORDANDO DA ESTRUTURA)


  #expected result include nump = 1,2,3 - ok
Select * from newtable
where vmin between 1 and 999999 and
vmin not between 200 and 299 and
vmin not between 300 and 399 and
vmin not between 400 and 999999;

#1,2,3,4 - ok
Select * from newtable
where vmin not between 400 and 999999 and
vmin between 1 and 999999 and
vmin not between 300 and 399;

#1,2,3,4,5 - ok
Select * from newtable
where vmin not between 400 and 999999 and
vmin between 1 and 999999 and
vmin between 1 and 399;

#1,2,3,4,5,6 -ok
Select * from newtable
where vmin between 1 and 999999




Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#490368 - 09/09/2019 19:28:52

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


Obrigado a todos, eu vou encerrar pois resolvi com a logica postada no ultimo fiddle que compartilhei

Vera Lucia


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por VERAPALI em 09/09/2019 19:29:08