【问题标题】:What does ::numeric and ::text mean in mysqlmysql中的 ::numeric 和 ::text 是什么意思
【发布时间】:2019-10-15 14:31:13
【问题描述】:

当我在 codewars 中练习 mysql 时,这个查询让我很困惑,因为我在这个查询中找不到 ::numeric::text 的含义。

查询:在棒球比赛中,击球率是衡量击球手表现的一种简单且最常用的方法。击球率的计算方法是将所有球员的击球数除以他们的 at_bats 数,通常显示为 3 位小数(即 0.300)。

给定一个具有以下架构的 yankees 表,

  • player_id 字符串
  • 玩家名称字符串
  • primary_position 字符串
  • 游戏整数
  • at_bats 整数
  • 命中整数

返回带有player_namegamesbatting_average 的表。

我们希望batting_average 被四舍五入到最接近的千分之一,因为这是棒球迷习惯看到它的方式。将其格式化为文本并确保它在小数点右侧有 3 位数字(必要时用零填充)。

接下来,按batting_average 对我们的结果表进行排序,第一行中的平均值最高。

最后,由于batting_average 是一个比率统计,少量at_bats 可以显着改变平均值。要纠正这一点,请排除任何没有至少 100 次击球的球员。

预期结果为输出:

  • 玩家名称字符串
  • 游戏整数
  • 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

【问题讨论】:

  • 据我所知,这不是有效的 MySQL 语法。

标签: mysql postgresql casting sqldatatypes


【解决方案1】:
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))

哎呀;这不太正确。但是谁的平均打击率为 999.7?

【讨论】:

    【解决方案2】:

    这不是 MySQL 语法。

    它是用于类型转换的 PostgreSQL 语法,作为CAST(hits AS numeric) 的更简洁替代方案。

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

    CAST 语法符合 SQL;带有 :: 的语法是 PostgreSQL 的历史用法。

    换句话说,它是一种非标准语法,仅适用于 PostgreSQL,不适用于 MySQL 或其他品牌的 RDBMS。

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多