Целочисленные разделительные столбцы - SQLite

Обновить

В соответствии с принятым (и правильным) ответом я прокомментировал в 2011 году:

Нижняя строка: мы не создавали контейнеры для хранения const T. Хотя я и подумал. И мы пришли очень близко к тому, чтобы сделать это случайно. Насколько мне известно, текущая точка привязки - это пара перегруженных функций address-члена в распределителе по умолчанию: Когда T - const, эти две перегрузки имеют одну и ту же подпись. Легкий способ исправить это было бы специализацией std::allocator и удалением одной из перегрузок.

blockquote>

С предстоящим проектом C ++ 17 мне кажется, что мы теперь легализованы vector, и я также считаю, что мы это сделали случайно . : -)

P0174R0 удаляет address перегрузки с std::allocator. P0174R0 не упоминает о поддержке std::allocator как части его обоснования.

Коррекция

В комментариях ниже T.C. правильно отмечает, что перегрузки address являются устаревшими , а не удалены. Виноват. Устаревшие члены не отображаются в 20.10.9, где std::allocator определен, но вместо этого отнесены к разделу D.9. Я забыл просканировать главу D для этой возможности, когда я разместил это.

Спасибо T.C. для исправления. Я предполагал удалить этот вводящий в заблуждение ответ, но, возможно, лучше оставить его с этой коррекцией, чтобы, возможно, это оставило бы кого-то еще от неправильного считывания спецификации так же, как и я.

-1
задан rmaddy 13 July 2018 в 17:52
поделиться

2 ответа

Я считаю, что ваша проблема может заключаться в том, что number_won_games и number_all_games являются целыми числами и, следовательно, деление всегда будет 0 и, следовательно, 0, умноженное на 100, будет равно 0, возможно, создается впечатление, что ничего не обновлено.

Вы можете попробовать выполнить casting number_won_games и number_all_games в REAL, например используя: -

UPDATE Table 
SET success = (CAST(number_won_games AS REAL) / CAST(number_all_games AS REAL)) * 100
WHERE name_game = 'some name';

Пояснительный пример

Учитывая следующее: -

DROP TABLE IF EXISTS t;
CREATE TABLE IF NOT EXISTS t (name_game TEXT, number_won_games INTEGER, number_all_games INTEGER, success REAL);
INSERT INTO t VALUES
    ('game1',10,20,0.12345678);
UPDATE t SET success = (number_won_games / number_all_games) * 100;
SELECT * FROM t;
UPDATE t SET success = (CAST(number_won_games AS REAL) / CAST(number_all_games AS REAL)) * 100;
SELECT * FROM t;
  • Предложение WHERE не требуется, не был включен.

Что вставляет строку с 20 играми, играемыми с 10 вон (таким образом, 50 как показатель успеха) и с успехом, установленным на ненулевое значение (чтобы показать, что первый обновление обновляется), затем

Первое UPDATE в соответствии с вашим примером приводит к: -

Пока второе UPDATE, которое выводит значения в РЕАЛЬНЫЕ результаты в: -

2
ответ дан MikeT 17 August 2018 в 12:27
поделиться

Я чувствую, что триггер - ваш лучший выбор здесь. У меня нет доступа к базе данных на данный момент, но что-то вроде этого, вероятно, сработает.

CREATE TABLE counter(id INTEGER PRIMARY KEY AUTOINCREMENT, success REAL, number_won_games REAL, number_all_games REAL);

CREATE TRIGGER counter_update_success AFTER UPDATE ON counter
BEGIN
    UPDATE counter set NEW.success=((NEW.number_won_games/NEW.number_all_games)*100.0);
END;

CREATE TRIGGER counter_create_success AFTER INSERT ON counter
BEGIN
    UPDATE counter set NEW.success=((NEW.number_won_games/NEW.number_all_games)*100.0);
END;
0
ответ дан David S. 17 August 2018 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: