Comando SQL

Firebird

02/09/2004

Gostaria de saber se existe algum comando para apagar os 2 ultimos digitos de um registro.
ex:

29814 --> 298
508550 --> 5085

o campo e inteiro e uso firebird 1.5


Rjcerri

Rjcerri

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

02/09/2004

Colega,

Vc quer apenas eliminar ? não precisa fazer nada com o ´resto´?
Se for...
update TABELA set CAMPO = cast((CAMPO / 100) as integer);

ou simplesmente :
update TABELA set CAMPO = (CAMPO / 100);


T+


GOSTEI 0
Rjcerri

Rjcerri

02/09/2004

Não quero nada com o resto,, tentei as duas formas e ele arredonda o resultado ex: 508558/100 = 5085,5 ai ele da o resultado de 5086 e esse numero e de outro produto.


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

Colega,

Aonde exatamente vc está executando e qual a instrução ? Se seu campo for [b:2fd1323c29]realmente INTEGER[/b:2fd1323c29] não existe arrendondamento... ele é simplesmente truncado... por via das dúvidas acabei de testar os exemplos diretamente no banco com IBExpert e dentro de uma aplicação usando dbExpress e IBX... e com um select :
select (CAMPO/100) as CAMPO_TRUNCADO from TABELA


Na base tenho : 199, 299 e 399 e o retorno é 1, 2 e 3...

T+


GOSTEI 0
Rjcerri

Rjcerri

02/09/2004

Estou usando no ibexpert, e o campo e integer, e estou usando a opcao update balcao set idpadrao=(idpadrao/100); e esta arrendondano. 508550 fica 5086


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

:shock:
Honestamente, não sei o que pode ser... já fiz e refiz os testes aqui e sempre tenho o resultado q vc precisa... seja com selects ou com update set ele sempre trunca...
Eu mesmo, em meus projetos, já utilizei-me disso...

T+


GOSTEI 0
Afarias

Afarias

02/09/2004

Interessante -- até onde sei ele ARREDONDA e não TRUNCA quando se faz um CAST AS INTEGER -- qual a versão do seu IB (ou FB) Vinícius?


T+


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

Estou com o FB 1.5.1 -- estranho... para mim o correto era o contrário...

E eu use isso semana passada migrando uma base Clipper (Numeric), exportado SDF os campos de ID ficaram com 2 decimais e eu tive que corrigir...

Será que eh diferença de versão? Eu nem usei cast... fiz o update set direto com o campo / 100... só passei a instrução com cast para o colega pq julguei q era mais correta, mesmo a outra tendo funcionado...

T+


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

Acho q encontrei a resposta...

[quote:16bf66501d=´Firebird QuickStartGuide.pdf, página 19,´][b:16bf66501d][u:16bf66501d]Division of an integer by an integer[/u:16bf66501d][/b:16bf66501d]

Firebird accords with the SQL standard by [color=red:16bf66501d]truncating the result (quotient) of an integer/integer calculation to
the next lower integer[/color:16bf66501d]. This can have bizarre results unless you are aware of it.
For example, this calculation is correct in SQL:
1 / 3 = 0
If you are upgrading from a RDBMS which resolves integer/integer division to a float quotient, you will need to
alter any affected expressions to use a float or scaled numeric type for either dividend, divisor, or both.
For example, the calculation above could be modified thus in order to produce a non-zero result:
1.000 / 3 = 0.333[/quote:16bf66501d]

Só não sei dizer se é só para o FB 1.5...
T+


GOSTEI 0
Afarias

Afarias

02/09/2004

|Eu nem usei cast... fiz o update set direto com o campo / 100.

Ahhh.. bom :)



T+


GOSTEI 0
Rjcerri

Rjcerri

02/09/2004

O que devo fazer? aquela mensagem em ingles não me ajudou muito.


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

Bem, na verdade aquela mensagem está dizendo que o que vc está tentando fazer deveria dar certo...
Como eu disse, honestamente, não sei o que pode estar acontecendo, já que comigo funciona...

afarias, vc pode realizar este teste também?
update tabela set campo = campo/100

será que só dá certo comigo? :roll:


GOSTEI 0
Afarias

Afarias

02/09/2004

|afarias, vc pode realizar este teste também?

hehehe... não precisa... neste caso é ´truncado´ sim... não é truncado de verdade, é apenas q é feito uma divisão nos inteiros (pq são 2 números inteiros) e dai...

O q falei q era arrendondado éra o CAST(n as INTEGER)


:D


T+


GOSTEI 0
Vinicius2k

Vinicius2k

02/09/2004

Bem, se era para funcionar e não funciona fica difícil de entender...

Talvez isso já seja ´apelação´, mas vamos lá :

Colega,

Declare a UDF (Tools->Script Executive no IBExpert):
DECLARE EXTERNAL FUNCTION DIV
    INTEGER,
    INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT ´IB_UDF_div´ MODULE_NAME ´ib_udf´

E tente rodar o update :
update TABELA set CAMPO = cast(div(CAMPO, 100) as integer)


Será que agora vai? :roll:

T+


GOSTEI 0
Afarias

Afarias

02/09/2004

o update apenas deve funcionar sim sem problemas, caso o CAMPO seja INTEGER::

update tabela set campo = campo / 100


caso o CAMPO sesa NUMERIC/FLOAT::

update tabela set campo = cast(campo as integer) / 100



Nestes casos não tem como ´arredondar´ pq o IB (ou FB) fará uma divisão nos inteiros (não há casas decimais)!

T+


GOSTEI 0
Rjcerri

Rjcerri

02/09/2004

depois que eu declarei a udf funcionou. Obrigado.


GOSTEI 0
POSTAR