sqlite 显示小数列,但尽可能显示整数

svujldwt  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(146)

我有一个这样的专栏

value
50.67
60.004
20.0
30.2
14.0

我需要它像这样展示

value
50.67
60.004
20
30.2
14

所以数字20.014.0显示为2014,因为它们本质上是整数。
有可能实现吗?.

3qpi33ja

3qpi33ja1#

有可能实现吗?.
从SQLite的Angular 来看,您不需要做任何事情;如以下所示:

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (v1 REAL, v2 TEXT, v3 NUMERIC, v4 blah_blah);
INSERT INTO mytable VALUES 
    (50.67,50.67,50.67,50.67),
    (60.004,60.004,60.004,60.004),
    (20.0,20.0,20.0,20.0),
    (30.2,30.2,30.2,30.2),
    (14.0,14.0,14.0,14.0),
    ('20.0','20.0','20.0','20.0');
SELECT * FROM mytable;
DROP TABLE IF EXISTS mytable;

结果是:

  • 对于所有典型的列类型(除了类型blah_blah,它将解析为NUMERIC列关联)。
    然而您最终如何从输出中检索结果(例如,android的getString将得到如上所述,但getDouble将得到一个double,无论该函数的默认精度是什么)可以/确实重要。
    因此,您可能希望像String一样检索值。
    *以上假设存储的值永远不会为NULL。可以使用coalesceifnull SQLite内置函数处理空值-请参见https://www.sqlite.org/lang_corefunc.html#coalesce和/或https://www.sqlite.org/lang_corefunc.html#ifnull
  • 您可能希望参考https://www.sqlite.org/datatype3.html#type_affinity(或者整个文档)以获得更详细的解释。

你可以使用类似的东西:

SELECT CASE WHEN (v1 - CAST(CAST(v1 AS INTEGER) AS REAL)) = 0 THEN CAST(v1 AS INTEGER) ELSE v1 END AS v1 FROM mytable;
  • 请注意,仅显示了一列

例如:-

它复制了SQLite实际上所做的事情,但是您仍然要受从结果输出中检索数据的函数的支配(同样,作为String类型的检索应该按原样获得输出)。
一句话的警告重新精确。如果我们考虑第二个基于SQL的解决方案的关键,你可能必须考虑完整的精度/不准确性/无法存储精确的十进制值。以下是不应该做的事情:

SELECT CAST(v1 AS INTEGER)|| CASE WHEN (v1 % 1)  > 0 THEN '.'||v1 % 1 ELSE '' END, (v1 - CAST(CAST(v1 AS INTEGER) AS REAL)) AS warning  FROM mytable;

这将导致两个部分(整数部分和尾数):

    • 因此,除非使用更复杂的过程,否则尝试从这两个部分构建一个字符串通常会导致意外的结果。
6jjcrrmo

6jjcrrmo2#

使用format() function%g说明符很容易做到这一点:

sqlite> create table foo(value REAL);
sqlite> insert into foo values (50.67), (60.004), (20.0), (30.2), (14.0);
sqlite> select * from foo;
50.67
60.004
20.0
30.2
14.0
sqlite> select format('%g', value) from foo;
50.67
60.004
20
30.2
14
sqlite>

需要注意的是,真正大的数字,或者接近0的数字最终将使用科学计数法显示。不过,这里的示例数字并不是问题。

相关问题