编辑:这里的答案:浮点数数学坏了吗?帮助理解这个问题。然而,这个问题并不是语言不可知论。它特定于SQLite处理的浮点数的文档化行为和亲和力。有一个与另一个问题非常相似的答案。
问:我有一个相当复杂的SQLite,其中子句比较数值。我在这里读过并“思考”过数据类型文档:https://www.sqlite.org/datatype3.html
对于SQLite用于确定比较子句(如=、>、<、<>等)中的数据类型的逻辑仍然感到困惑。我可以将我的示例缩小到这个测试SQL中,其结果对我来说没有什么意义。
SELECT
    CAST(10 AS NUMERIC) + CAST(254.53 AS NUMERIC) = CAST(264.53 AS NUMERIC) AS TestComparison1,
    CAST(10 AS NUMERIC) + CAST(254.54 AS NUMERIC) = CAST(264.54 AS NUMERIC) AS TestComparison2
Result: "1" "0"select语句(TestComparison2)中的第二个表达式是将方程的左侧转换为文本值。我可以通过将方程的右侧转换为文本和结果= 1来证明这一点。
显然,在SQLite计算亲和力的过程中,我遗漏了一些东西。这些值来自大型/复杂查询中的列。为了避免这些问题,我应该在WHERE/Join子句中把等式的两边都投到文本中吗?
发布于 2018-04-15 20:18:06
您没有得到预期结果的原因是,基本结果将是浮点数。
尽管DataTypes in SQLite3涉及的内容很多,但您也应该考虑表达式中的以下部分:
类型名称转换处理的亲和性() 无 将值转换为没有关联的类型名称将导致将该值转换为BLOB。对BLOB的转换包括首先在数据库连接的编码中将值转换为文本,然后将结果字节序列解释为BLOB而不是文本。 文本 若要将BLOB值转换为文本,构成BLOB的字节序列将被解释为使用数据库编码编码的文本。 将整数或实值转换为文本,就像通过sqlite3_snprintf()呈现值一样,但结果文本使用数据库连接的编码。 真品 当将BLOB值转换为REAL时,该值首先被转换为文本。 当将文本值转换为实值时,可以解释为实数的值的最长前缀将从文本值中提取,而其余值则被忽略。文本值中的任何前导空格在从文本聚合到实值时都会被忽略。 如果没有前缀可以解释为实数,则转换结果为0.0。 整型 当将BLOB值转换为整数时,该值首先转换为文本。当将文本值转换为整数时,可以解释为整数的值>的最长前缀将从文本值中提取出来,其余的前缀将被忽略。当从文本转换为整数时,文本值中的任何前导空格都将被忽略。 如果没有可以解释为整数的前缀,则转换结果为0。 如果前缀整数大于+9223372036854775807,那么转换的结果就是+9223372036854775807。同样,如果前缀整数小于-9223372036854775808,则强制转换的结果正是-9223372036854775808。 当转换为整数时,如果文本看起来像带指数的浮点值,则指数将被忽略,因为它不是整数前缀的一部分。例如,“(将'123e+5‘强制转换为整数)”将导致123,而不是12300000。 强制转换操作符只理解十进制整数-十六进制整数的转换在十六进制整数字符串的"0x“前缀中的"x”处停止,因此转换的结果总是为零。 将实值转换为整数后,在实值与最接近实值的零之间生成整数。如果实数大于最大可能有符号整数(+9223372036854775807),则结果是最大可能有符号整数,如果实数小于最小可能有符号整数(-9223372036854775808),则结果是最小可能有符号整数。 在SQLite版本3.8.2 (2013-12-06年)之前,将大于+9223372036854775807.0的实际值转换为整数会产生最负的整数-9223372036854775808。此行为的目的是在执行等效转换时模仿x86/x64硬件的行为。 数值型 将文本或BLOB值转换为数字首先执行强制转换为实值,然后进一步将结果转换为整数当且仅当从实到整数的转换是无损和可逆的。--这是SQLite中唯一一个数值和整数关联行为不同的上下文()。 将实值或整数值转换为数字是不需要操作的,即使实值可以无损地转换为整数。
备注
在本节之前,有一个关于文字值的章节(也就是说,强制转换可能只需要应用于从列中提取的值)。
试着:-
SELECT
    round(CAST(10 AS NUMERIC) + CAST(254.53 AS NUMERIC),2) = round(CAST(264.53 AS NUMERIC),2) AS TestComparison1,
    round(CAST(10 AS NUMERIC) + CAST(254.54 AS NUMERIC),2) = round(CAST(264.54 AS NUMERIC),2) AS TestComparison2:-

https://stackoverflow.com/questions/49844776
复制相似问题