что означает :: числовой и :: текст означает в MySQL - PullRequest
0 голосов
/ 30 мая 2019

, пока я практикую mysql в codewars, этот запрос запутывает, потому что я не могу найти значения ::numeric и ::text в этой очереди.

ouery: -

В бейсболе средний уровень ватина - это простой и наиболее распространенный способ измерения производительности нападающего. Среднее значение ватина рассчитывается путем взятия всех ударов игроков и деления его на их число at_bats, и обычно оно отображается в виде трехзначного десятичного числа (то есть 0,300).

Учитывая таблицу янки со следующей схемой,

  • player_id STRING

  • player_name STRING

  • primary_position STRING

  • игры INTEGER

  • at_bats INTEGER

  • хиты INTEGER

возвращает таблицу с player_name, games и batting_average.

Мы хотим, чтобы batting_average было округлено до тысячных долей, поскольку именно так привыкли видеть его любители бейсбола. Отформатируйте его как текст и убедитесь, что он содержит 3 цифры справа от десятичной дроби (в случае необходимости необходимо заполнить нулями).

Затем закажите нашу результирующую таблицу на batting_average с самым высоким средним значением в первой строке.

Наконец, поскольку batting_average является статистикой тарифов, небольшое число at_bats может значительно изменить среднее значение. Чтобы исправить это, исключите любого игрока, у которого нет летучих мышей как минимум 100.

Таблица ожидаемых выходных данных

  • player_name STRING

  • игры INTEGER

  • batting_average STRING

решение по codewars: -

select player_name,
       games,
       round(hits::numeric / at_bats, 3)::text as batting_average
from yankees
where at_bats > 100
order by 3 desc

Ответы [ 2 ]

0 голосов
/ 30 мая 2019
round(hits::numeric / at_bats, 3)::text

->

RIGHT(ROUND(hits / at_bats, 3), 3)

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

Примеры:

mysql> SELECT RIGHT(ROUND(7 / 120, 3), 3);
+-----------------------------+
| RIGHT(ROUND(7 / 120, 3), 3) |
+-----------------------------+
| 058                         |  -- leading zero works
+-----------------------------+
1 row in set (0.00 sec)

mysql> SELECT RIGHT(ROUND(120 / 120, 3), 3);
+-------------------------------+
| RIGHT(ROUND(120 / 120, 3), 3) |
+-------------------------------+
| 000                           |   -- Oops, "batting a thousande" fails
+-------------------------------+
1 row in set (0.00 sec)

Итак:

SELECT IF(hits = at_bats, '1000', RIGHT(ROUND(hits / at_bats, 3), 3))

Oops; это не совсем правильно. Но кто когда-либо получает средний уровень 999,7?

0 голосов
/ 30 мая 2019

Это не синтаксис MySQL.

Это синтаксис PostgreSQL для типов, как более краткая альтернатива CAST(hits AS numeric).

См .: https://www.postgresql.org/docs/current/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS

Синтаксис CAST соответствует SQL; синтаксис с :: является историческим использованием PostgreSQL.

Другими словами, это нестандартный синтаксис, который работает только в PostgreSQL, а не в MySQL или других марках СУБД.

...