I've experienced some weirdness with the results of a comparison
between values of different data types. I'm not sure if this is due
to type affinity, implicit conversion, or something else, but it
doesn't behave as I expect it to as indicated in the documentation.
Take the following query for example:
SELECT
'2 < ''10''' AS COMPARISON,
2 < '10' AS RESULT,
TYPEOF(2) AS TYPE1,
TYPEOF('10') AS TYPE2
UNION ALL
SELECT
'2 < CAST(''10'' AS TEXT)',
2 < CAST('10' AS TEXT),
TYPEOF(2),
TYPEOF(CAST('10' AS TEXT))
UNION ALL
SELECT
'CAST(2 AS INTEGER) < ''10''',
CAST(2 AS INTEGER) < '10',
TYPEOF(CAST(2 AS INTEGER)),
TYPEOF('10')
UNION ALL
SELECT
'CAST(2 AS INTEGER) < CAST(''10'' AS TEXT)',
CAST(2 AS INTEGER) < CAST('10' AS TEXT),
TYPEOF(CAST(2 AS INTEGER)),
TYPEOF(CAST('10' AS TEXT))
UNION ALL
SELECT
'''2'' < 10',
'2' < 10,
TYPEOF('2'),
TYPEOF(10)
UNION ALL
SELECT
'CAST(''2'' AS TEXT) < 10',
CAST('2' AS TEXT) < 10,
TYPEOF(CAST('2' AS TEXT)),
TYPEOF(10)
UNION ALL
SELECT
'''2'' < CAST(10 AS INTEGER)',
'2' < CAST(10 AS INTEGER),
TYPEOF('2'),
TYPEOF(CAST(10 AS INTEGER))
UNION ALL
SELECT
'CAST(''2'' AS TEXT) < CAST(10 AS INTEGER)',
CAST('2' AS TEXT) < CAST(10 AS INTEGER),
TYPEOF(CAST('2' AS TEXT)),
TYPEOF(CAST(10 AS INTEGER))
;
COMPARISON |RESULT |TYPE1 |TYPE2
2 < '10' |1 |integer |text
2 < CAST('10' AS TEXT) |0 |integer |text
CAST(2 AS INTEGER) < '10' |1 |integer |text
CAST(2 AS INTEGER) < CAST('10' AS TEXT) |1 |integer |text
'2' < 10 |0 |text |integer
CAST('2' AS TEXT) < 10 |0 |text |integer
'2' < CAST(10 AS INTEGER) |1 |text |integer
CAST('2' AS TEXT) < CAST(10 AS INTEGER) |1 |text |integer
According to the numeric-literal description at
http://sqlite.org/lang_expr.html, a number without a decimal should be
considered an integer literal. Similarly a string enclosed in single
quotes is a string constant. A TYPEOF of each value in the example
confirms they are INTEGER and TEXT respectively.
According to https://sqlite.org/datatype3.html section 4.2, if one
operator in a comparison is TEXT and the other is INTEGER or no
affinity, then the TEXT operator is converted to NUMERIC. Now it
doesn't state if this conversion follows the rules of a CAST to
NUMERIC, but in the example that would effectively make the NUMERIC an
INTEGER.
So going by what I read here, all these comparisons should be
comparing INTEGER to INTEGER, but that clearly isn't the case. What's
even more surprising is the introduction of a CAST alters the results,
at least for some of the comparisons.
Could someone explain the varying results? What is it really doing?
Jeremy
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users