The comparison is between a column with "numeric" (integer) affinity and a text value with no affinity. The text value is an empty string.
Affinity conversion would attempt to convert the text value with no affinity into a numeric value (0) IF AND ONLY IF the conversion is lossless and reversible. In the case of an empty string, the conversion is not reversible: cast('' as numeric) -> 0 but cast(0 as text) -> '0' ('0' != '') so therefore no conversion is made. Since the '' is a value with no affinity, no conversion to text is done. Because the column has an affinity there can be no attempt to convert it to a text storage class to permit the comparison to be performed in the text domain. You would have to do this yourself with a cast. This means that an numeric is compared to text, and the numeric value is always less. If, rather than an empty string, you had used a value of the string which permitted the conversion of the string to NUMERIC to be both lossless and reversible (ie, actually had something in the string, like '0'), you would obtain different results. (note that a value has no affinity, although it does have a storage class, and the conversion rules are based on affinities, not storage classes. Affinity is applied to a value either because it originated from a column which has an affinity or is assigned by the cast operator). Note that although 5 == '5' is false, this is because there is no affinity assigned to either of the values 5 and '5', so no conversions occur, and numbers are always less than text strings. If one did assign one of the values an affinity, for example by using a cast on either (cast(5 as integer) or cast('5' as text)) or because one of them was derived from a column-value that had an affinity (either text or numeric), then the result would be true since '5' can be losslessly and reversibly converted to an integer (and 5 can be losslessly and reversibly converted to text '5'), and in either case the result of the converted comparison in either domain is true. https://www.sqlite.org/datatype3.html#comparisons --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >-----Original Message----- >From: sqlite-users [mailto:sqlite-users- >boun...@mailinglists.sqlite.org] On Behalf Of ?????? >Sent: Sunday, 19 August, 2018 00:58 >To: sqlite-users >Subject: [sqlite] bug: compare number with empty string get different >resut > >create table t1(c int); >insert into t1 values (1),(2),(3); >select * from t1 where c>'' ; --get nothing(empty result) >select * from t1 where c<''; --get result set:1,2,3 > > >create table t2(c char); >insert into t2 values (1),(2),(3); >select * from t2 where c>''; --get correct result set: 1,2,3 > >the only difference of t1 and t2 is the column data type: int vs char >_______________________________________________ >sqlite-users mailing list >sqlite-users@mailinglists.sqlite.org >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users