比较判断式
比较判断式是由一个比较操作符连接两个表达式构成。有六个传统比较运算符:
=, >, <, >=, <=, <>
(比较运算符的完整列表和他们的变异形式,参阅比较运算符)
如果其中一个侧面(左或右)比较判断式为NULL,则判断式的值将为UNKNOWN。
例子:
1.检索关于电脑的信息,CPU频率不少于500 MHz,价格低于800美元
SELECT *
FROM Pc
WHERE speed >= 500 AND price < 800;
2. 检索关于dot matrix printers 的信息,成本低于300美元
SELECT *
FROM Printer
WHERE ptrtype = 'matrix' AND price < 300;
3.下面的查询将没有数据返回,如果没有为它们指定打印机的类型,一个判断式中NULL同NULL比较返回NULL:
SELECT *
FROM Printer
WHERE ptrtype = NULL AND price < 300;
另一方面ptrtype能被用于NULL测返回一个结果:只是,它不是比较测试:
SELECT *
FROM Printer
WHERE ptrtype IS NULL AND price < 300;
—参阅 IS [NOT] NULL.
其它比较判断式
其它比较判断式被标记为关键字符号。
BETWEEN
适用: DSQL, PSQL, ESQL
语法:
<value> [NOT] BETWEEN <value_1> AND <value_2>
BETWEEN判断式测试一个值是否落在两个值的指定范围内。(NOT BETWEEN测试一个值是否落不在两个值的指定范围内)
对于BETWEEN判断式的操作数是兼容的数据类型的两个参数,不像在一些其他的DBMS,在Firebird中 BETWEEN判断式是不对称的 — — 如果较低的值不是第一个参数, BETWEEN判断式将始终返回 False。搜索是包容性的(通过这两个参数所代表的值被包括在搜索中)。换句话说,BETWEEN 判断式可以被重写:
<value> >= <value_1> AND <value> <= <value_2>
当BETWEEN被用于DML查询的搜索条件时,Firebird优化器可以在使用搜索列中的索引,如果它是可用的。
例子:
SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN date '01.01.1992' AND CURRENT_DATE
LIKE
适用: DSQL, PSQL, ESQL
语法:
<match value> [NOT] LIKE <pattern>
[ESCAPE <escape character>]
<match value> ::= character-type expression
<pattern> ::= search pattern
<escape character> ::= escape character
LIKE判断式比较字符串表达式与第二个表达式被定义的模式进行比较。比较大小写或重音敏感由使用的排序规则决定。如果需要,一个排序规则可以为任一操作数指定。
通配符
两种通配符可用于搜索模式:
•百分比符号(%)将匹配被测试值的零个或更多字符的任何序列。
•下划线(_)将匹配被测试值任何单个字符
如果被测试的值同考虑到通配符号的模式相匹配,则判断式为真值
使用转义字符选项
如果搜索字符串中包含通配符符号之一,可以用 ESCAPE 子句来指定转义字符。转义字符必须符号前面加上 '%' 或 '_' 在搜索字符串中,以指示符号是将被解释为原义字符。
使用LIKE的例子:
1.查找名称以"Software"这个词开始的部门的编号
SELECT DEPT_NO
FROM DEPT
WHERE DEPT_NAME LIKE 'Software%';
它可能使用一个在DEPT_NAME字段上的索引,如果索引存在。
关于LIKE与优化
实际上,LIKE判断式不使用索引,如果判断式采用LIKE 'string%' 形式,它将被转换为STARTING WITH判断式,这样将会使用索引.
因此,如果你需要使用以一个字符串开始的搜索,建议使用STARTING WITH判断式替代LIKE判断式。
2.查找名字为5个字母组成的员工,名字以"Sm"开始且以"th"结束,对于诸如"Smith"和"Smyth"将是真值。
SELECT
first_name
FROM
employee
WHERE first_name LIKE 'Sm_th'
3.查找包含字符串"Rostov"的所有客户地址:
SELECT *
FROM CUSTOMER
WHERE ADDRESS LIKE '%Rostov%'
备注
如果你需要做一个不区分大小写的搜索,"东西"封闭在一个字符串内(LIKE '%Abc%'),建议使用CONTAINING判断式,而不是使用LIKE判断式
4.查找包含下划线字符的表名。"#"被规定作为转义字符:
SELECT
RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME LIKE '%#_%' ESCAPE '#'
参阅: STARTING WITH, CONTAINING, SIMILAR TO