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á não rola pois ele trás 'aquele' range e não os ranges até ele (com 508, deveria trazer 400 também).

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ê não quer ranges e acho que está complicando demais a lógica

Você ter um range mínimo e máximo faz sentido apenas se a partir de um certo valor você quer excluir opções 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 mínimo

Select * from newtable where vmin <= 580


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

Você só precisa do valor máximo se quiser excluir uma opção dependendo do range, o que não faz muito sentido




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

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


Depois de bater muita cabeça, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range é valido para qualquer situação 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

Faça 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. Além do mais, testei com todos os critérios que você postou e funcionou perfeitamente.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem 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 cabeça, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range é valido para qualquer situação cheguei nisto:

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

Citação:
Vera, não 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 máximo maior que outros registros que estão entre esse intervalo.

Eu não 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 não é tão simples o raciocinio como vocês expos, se você analizar o fiddle que coloquei verá que não 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 não sei se está realmente difícil de resolver isso ou se você não quer aceitar respostas que não sejam do jeito que você espera, porque está até difícil de entender o resultado que você espera

Então vamos colocar desta forma, eu consigo imaginar duas situações 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 situação 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 não satisfazem o critério

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 comparação com o mínimo e máximo, e mesmo tendo falado na minha primeira resposta isso parece que você ignorou completamente e continuou fazendo errado.

A segunda situação é que dado um valor eu quero trazer todos os registros em que o valor informado está entre vmin e vmax e também 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 lógica pois você não precisa de valor máximo, só de mínimo, com os dois não tem como fazer, e essa é a solução que dei em minha segunda resposta mas que parece também ter sido ignorada completamente, sendo que o simples select como este trás estes resultados
SELECT nump from newtable WHERE vmin <= 480


Se nada disso te servir então 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 não 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 não sei se está realmente difícil de resolver isso ou se você não quer aceitar respostas que não sejam do jeito que você espera, porque está até difícil de entender o resultado que você espera

Então vamos colocar desta forma, eu consigo imaginar duas situações 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 situação 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 não satisfazem o critério

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 comparação com o mínimo e máximo, e mesmo tendo falado na minha primeira resposta isso parece que você ignorou completamente e continuou fazendo errado.

A segunda situação é que dado um valor eu quero trazer todos os registros em que o valor informado está entre vmin e vmax e também 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 lógica pois você não precisa de valor máximo, só de mínimo, com os dois não tem como fazer, e essa é a solução que dei em minha segunda resposta mas que parece também ter sido ignorada completamente, sendo que o simples select como este trás estes resultados
SELECT nump from newtable WHERE vmin <= 480


Se nada disso te servir então 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 não em outro


Pois é , na minha primeira resposta já havia dito que há erro na lógica.
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 cabeça, e ouvindo conselhos a cerca de deixar o campo com valores NULOS quando o range é valido para qualquer situação cheguei nisto:

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


Sendo que postei uma solução que retornou os resultados desejados em todas as situações...(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