【问题标题】:Need a DataType which store data as Int, but also Decimal需要一个将数据存储为 Int 和 Decimal 的 DataType
【发布时间】:2018-11-12 16:40:18
【问题描述】:

我在 mysql 中遇到了一些关于数据类型的问题

我有下表:

id (int,primary key),
tipo (varchar(45)),
inteiro_pedaco (varchar(45)),
marca (varchar(45)),
a (decimal(11,1),
b (decimal(11,1),
c (int (11))

A 和 B 列应存储以下格式的数据:00.0、00.1 等。

但是,A 和 B 列也应该能够像 INT 一样存储数据,而不仅仅是十进制,但是,如果我尝试输入“10”,它会自动格式化为“10.0”

最大的问题是:这两列(A 和 B)必须存储 10 作为值,其他时候存储 10.0,即使 10.0 等于 10,它也必须完全按照发送的方式存储,不管有没有小数点。如果输入为 10,则必须存储为 10,如果输入为 10.0,则必须为 10.0

我知道这听起来很奇怪,但相信我,它有时会接收 10.0 的数据,我没有使用 10.0 作为示例,它确实会接收 10.0 和 10 的数据

我尝试阅读有关数据类型的信息,但除了 varchar 之外,我找不到任何满足这些要求的人,但在这种情况下我不能使用 varchar,而且,我不能创建两个单独的列来存储数据,它们必须在同一个专栏

我正在考虑将所有内容保存为十进制,并在进行选择时对其进行格式化,但在这种情况下,我必须创建一个新列来存储它是否为十进制

那么,有什么数据类型符合上面的描述吗?如果没有,格式化是做我想做的唯一方法吗?

感谢您的帮助

【问题讨论】:

  • 您的数据似乎很混乱。该值是一个数字,尾随的零无关紧要。或者该值是一个字符串,算术实际上没有意义。值包含什么?
  • 试试浮点数据类型
  • 只会存储数字,但是,我也不喜欢这种存储数据的方式,不幸的是,我没有太多选择,因为我只是按照人们告诉我的去做。我得说,我的数学很烂,我的老板试图向我解释为什么必须这样,但我一点也不明白,而且他不太懂编程(在我的情况下,我还在学习,我只是实习生),所以我认为我可以尝试检查是否有可能,但是从它的样子来看,我认为我必须再次与我的老板联系,看看我们会做什么,并尝试向他解释为什么会这样不可能
  • @saravanatn,我试过float,但是没有用
  • 我不知道1010.0之间有什么区别?

标签: sql mysql-workbench sqldatatypes


【解决方案1】:

您可能需要考虑拥有多个列。例如 DEC_VAL、INT_VAL、STR_VAL

这将解决连接问题和过滤器问题,但维护起来稍微困难。

【讨论】:

  • 它不能解决问题,因为我不能有超过 3 个维度的列。 A、B 和 C 用于几乎所有内容。例如,当“tipo”栏为“tubo”时,“A”为外径,“B”为内径,但如果“tipo”栏为“placa”,“A”为宽度,“B”为厚度
  • 因为我不知道如何解决这个问题,所以我来这里寻求帮助,也许是一个解决方案。万一我找不到出路,我想我只需要和我的老板开会
【解决方案2】:

听起来问题在于,当您获取数据而不是如何存储数据时,如果小数点会造成问题(例如您希望在输出期间具有某种外观),则可以尝试为 select 使用 case 语句。

select case when cast(cast(A as int) as decimal) = A then cast(A as int) else A end

我们在这里所做的是测试作为 int 的列 A 是否等于作为小数的列 A,如果它们相同,我们将其转换为 int。如果它们不相等,我们将 A 列保留为小数。

正如其他人所说,这是一个奇怪的问题,因为大多数事情都会评估 1.0 = 1,但我猜这是输出格式,而不是逻辑评估。无论如何希望这会有所帮助:)

【讨论】:

  • 这将不起作用,因为 CASE 返回单个数据类型,在本例中为 DECIMAL。
  • 如果我理解正确,它不会起作用,因为如果例如 A 存储了 10.0 并且测试为 int (10) 如果它等于 A 作为十进制,它将被理解为 true , 正确的?那么输出将是 10,但是 .0 不能被忽略,嗯......我不是说我说了一些愚蠢的话(我还在学习,所以,请原谅我呵呵)
【解决方案3】:

如果尾随或前导变量很重要,则应将值存储为字符串。你真的没有太多选择。

基本上,值不是数字,而是某种代码。在数字世界中,10.0 等于 10

编辑:

根据您的评论,您应该有两列都是整数。一个是“小数点之前的部分”,第二个是范围。

试图将两件事放在一列中是错误的。

【讨论】:

  • 如果存储为字符串,当需要做一些数学运算时,不会有什么问题吗?简单来说,点后面的数字将有两种使用方式,由“tipo”列定义。第一种方法是:点之前的数字将被应用到一些计算中,点之后的数字将定义它的范围。第二种方式,当“tipo”列不匹配指定条件时,将使用整个数字进行计算,即使是点后的数字
  • @Kouhei 。 . .字符串值将(静默)转换为操作的数字。但你似乎还有其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2016-08-07
  • 1970-01-01
  • 2014-05-27
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多