2014-01-10 3 views
0

Вероятно, это хорошо известные вопросы, но я не могу найти ответ в документах. Если я бегу эти запросы:Зачем мне нужен запрос CAST()?

SELECT @next := 2, @amount := 1; 

SELECT @next := 0.2, @amount := 0.1, @result := @next - @amount; 

я получить неправильно @result = «0»

При запуске 2-й запрос еще раз, результат будет правильным.

Если я использую литье типов во втором запросе и снова запускаю оба запроса, результат будет правильным. I.e.,

SELECT @next := 0.2, @amount := 0.1, @result := CAST(@next AS DECIMAL(2,2)) - @amount; 

Почему это происходит? Что мне читать?

ответ

2

Я думаю, что происходит это вы первый набор @next: = 2, @amount = 1.
Что тогда делает @next и @amount типа междунар.
Итак, когда вы назначаете @next: = 0.2, @amount: = 0.1 на этой строке @next берет значение нуля, а также @amount. Но после этого select run @next меняет тип на десятичный. Чтобы увидеть, что происходит на самом деле попробовать этот

SELECT @next := 2, @amount := 1; 

SELECT @next := 0.2, @amount := 0.1, @next, @amount, @result := @next - @amount; 

SELECT @next,@amount; 

так, чтобы не имея CAST, просто установите первое заявление в

SELECT @next := 2.0, @amount := 1.0; 

и все начнется как десятичное и все должно работать, как ожидалось.

+0

Ах, я понял - пользовательская переменная сохраняет свой начальный тип, и мне нужно явно изменить его, если он не соответствует типу нового назначенного значения! Спасибо. –

0

Выраженное выражение имеет сходную семантику с выражением SQL CONVERT . Выраженное выражение используется для преобразования значения одного типа в значение другого типа.

DECIMAL состоит из двух частей: Precision и Scale. Так что часть вашего запроса будет выглядеть следующим образом:

CAST(@next AS DECIMAL(2,2)) 

Precision представляет собой число значащих цифр, которые хранятся для значений.
Scale представляет количество цифр, которое можно сохранить после десятичной точки.

Read More

+0

Да, я понимаю, какой тип литья делать. Но зачем мне это в моем примере? –

Смежные вопросы