加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQLite - 比较表达式

(2013-04-22 21:27:54)
标签:

sqlite比较表达式

it

分类: Mac/IOS那些事

1.0 比较表达式

     Sqlite v3有一系列有用的比较操作符,包括 "=", "==", "<", "<=", ">", ">=", "!=", "<>", "IN", "NOT IN",

          "BETWEEN", "IS", "IS NOT"

 

1.1 排序

比较操作的结果基于操作数的存储类型,根据下面的规则:

l  存储类型为NULL的值被认为小于其他任何的值(包括另一个存储类型为NULL的值)

2  一个INTEGERREAL值小于任何TEXTBLOB值。当一个INTEGERREAL值与另外一个INTEGERREAL值比较的话,就执行数值比较

3  TEXT值小于BLOB值。当两个TEXT值比较的时候,就根据序列的比较来决定结果

4  当两个BLOB值比较的时候,使用memcmp来决定结果

 

1.2 比较操作数的近似(Affinity

   Sqlite可能在执行一个比较之前会在INTEGERREALTEXT之间转换比较值。

   是否在比较操作之前发生转换基于操作数的近似(类型)。操作数近似(类型)由下面的规则决定:

l  对一个列的简单引用的表达式与这个列有相同的affinity,注意如果XY.Z是列名,那么+X+Y.Z均被认为是用于决定affinity的表达式

2  一个”CAST(expr as type)”形式的表达式与用声明类型为”type”的列有相同的affinity

3  其他的情况,一个表达式为NONE affinity

 

1.3 在比较前的类型转换

         只有在转换是无损、可逆转的时候“应用近似”才意味着将操作数转换到一个特定的存储类。

    近似在比较之前被应用到比较的操作数,遵循下面的规则(根据先后顺序):

l  如果一个操作数有INTEGERREALNUMERIC近似,另一个操作数有TEXTNONE近似,

  NUMERIC近似被应用到另一个操作数

2 如果一个操作数有TEXT近似,另一个有NONE近似,那么TEXT近似被应用到另一个操作数

3  其他的情况,不应用近似,两个操作数按本来的样子比较

表达式"a BETWEEN b AND c"表示两个单独的二值比较 a >= b AND a <= c”,即使在两个比较中不同的近似被应用到’a’

 

 比较举例

CREATE TABLE t2(

    a TEXT,      -- text affinity

    b NUMERIC,   -- numeric affinity

    c BLOB,      -- no affinity

    d            -- no affinity

);

 

INSERT INTO t2 VALUES('500', '500', '500', 500);

SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t2;

text|integer|text|integer

 

-- Because column "a" has text affinity, numeric values on the

-- right-hand +side of the comparisons are converted to text before

-- the comparison occurs.

SELECT a < 40,   a < 60,   a < 600 FROM t2;

0|1|1

 

-- Text affinity is applied to the right-hand operands but since

-- they are already TEXT this is a no-op; no conversions occur.

SELECT a < '40', a < '60', a < '600' FROM t2;

0|1|1

 

-- Column "b" has numeric affinity and so numeric affinity is applied

-- to the operands on the right.  Since the operands are already numeric,

-- the application of affinity is a no-op; no conversions occur.  All

-- values are compared numerically.

SELECT b < 40,   b < 60,   b < 600 FROM t2;

0|0|1

 

-- Numeric affinity is applied to operands on the right, converting them

-- from text to integers.  Then a numeric comparison occurs.

SELECT b < '40', b < '60', b < '600' FROM t2;

0|0|1

 

-- No affinity conversions occur.  Right-hand side values all have

-- storage class INTEGER which are always less than the TEXT values

-- on the left.

SELECT c < 40,   c < 60,   c < 600 FROM t2;

0|0|0

 

-- No affinity conversions occur.  Values are compared as TEXT.

SELECT c < '40', c < '60', c < '600' FROM t2;

0|1|1

 

-- No affinity conversions occur.  Right-hand side values all have

-- storage class INTEGER which compare numerically with the INTEGER

-- values on the left.

SELECT d < 40,   d < 60,   d < 600 FROM t2;

0|0|1

 

-- No affinity conversions occur.  INTEGER values on the left are

-- always less than TEXT values on the right.

SELECT d < '40', d < '60', d < '600' FROM t2;

1|1|1


从这里可以看出,假如可以使用3.1中的规则进行比较的话,就不需要进行类型转换,否则的话就要进行类型转换

 

1.4 操作符

所有的数学操作符(+, -, *, /, %, <<, >>, &, |),在被执行前,都会将两个操作数都转换为数值存储类型(INTEGERREAL)。即使这个转换是有损和不可逆的,转换仍然会执行。一个数学操作符上的NULL操作数将产生NULL结果。一个数学操作符上的操作数,如果以任何方式看都不像数字,并且又不为空的话,将被转换为00.

src://http://www.cnblogs.com/kfqcome/archive/2011/06/27/2137000.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有