在SQL Server中,关键字DEFAULT可以用来把一列设置为它的缺省值。你不能用Oracle的UPDATE命令来设置一列为它的缺省值。
Transact-SQL和Oracle SQL都支持在一个UPDATE语句中使用子查询。但是Transact-SQL的FROM子句可以用来创建一个基于节点的UPDATE。这个能力是你的UPDATE语法更加可读并且在某种意义上提高了性能。
Oracle
Microsoft SQL
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
WHERE SSN IN (SELECT SSN
FROM GRADE G
WHERE G.SSN = S.SSN
AND G.CCODE = '1234')
Subquery:
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
WHERE SSN IN (SELECT SSN
FROM GRADE G
WHERE G.SSN = S.SSN
AND G.CCODE = '1234')
FROM clause:
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
FROM GRADE G
WHERE S.SSN = G.SSN
AND G.CCODE = '1234'
DELETE语句
在大多数情况下,你不需要修改DELETE语句。但是如果你在Oracle中执行依赖SELECT语句的删除操作,你就必须进行修改,因为在Transact-SQL不支持这种功能。
Transact-SQL支持在WHERE子句中使用子查询,FROM子句也一样。后者可以产生更有效的语句。请参看前面在“UPDATE语句”中的例子。
Oracle
Microsoft SQL
DELETE [FROM]
{table_name | view_name | select_statement}
[WHERE clause]
DELETE
[FROM ]
{
table_name [ [AS] table_alias] WITH ( <table_hint_limited> […n])
| view_name [ [AS] table_alias]
| rowset_function_limited
}
[ FROM {<table_source>} [,…n] ]
[WHERE
{ <search_condition>
|{ [ CURRENT OF
{
{ [ GLOBAL ] cursor_name }
cursor_variable_name
}
]
}
]
[OPTION (<query_hint> [,…n])]
TRUNCATE TABLE语句
在Oracle和Microsoft SQL Server中TRUNCATE TABLE语句的语法是相似的。TRUNCATE TABLE语句用来把一个表中的所有行清除掉,并且这个操作是不能后滚的。该表的结构和索引仍然存在。DELETE触发器不会被执行。如果该表被一个FOREIGN KEY引用,则该表不能被砍掉。
Oracle
Microsoft SQL
TRUNCATE TABLE table_name
[{DROP | REUSE} STORAGE]
TRUNCATE TABLE table_name
在SQL Server中,这个语句只能由表的所有者给出。在Oracle中,只有当你是表的所有者或者有DELETE TABLE系统特权时才能使用该语句。
Oracle的TRUNCATE TABLE命令可以随意的释放被表中的行占据的存储空间。SQL Server的 TRUNCATE TABLE则总是回收被表中的数据和与之关联的索引占据的空间。
在identity和timestamp列中操作数据
Oracle序列是一种和任何给定的表或者列都不直接相关的数据库对象。一列和一个序列的关系是在应用程序中实现的,方法是把一个序列的值分配给一个列。因此在同序列一起工作的时候,Oracle并没有强化任何规则。但是在Microsoft SQL Server的标识列中,值是不能被更新的并且也不能使用DEFAULT关键字。
缺省情况下,数据不能直接插入到一个标识列中。标识列为新插入表的每一行自动产生一个唯一的、顺序的数字。这个缺省设置可以用下面的SET语句覆盖。
SET IDENTITY_INSERT table_name ON
当IDENTITY_INSERT设置为ON时,用户就可以在新行的标识列中插入任何值。为了防止输入重复的值,必须在该列上创建一个唯一的索引。这个语句的目的是允许用户为一行重新创建一个偶然被删除的值。@@IDENTITY可以用来获取最后一个标识值。
TRUNCATE TABLE语句把一个标识列重新设置为它原来的SEED值。如果你不想为一列重新设置标识值,可以用不带WHERE子句的DELETE子句来代替TRUNCATE TABLE语句。你必须估计这会给你的Oracle移植带来什么样的影响,因为ORACLE SEQUENCES不会跟着TRUNCATE TABLE命令重新设置。
对时间信息(timestamp)列,你只能执行插入或者删除操作。如果你试图更新一个时间信息列,你将收到这样的错误消息。
Msg 272, Level 16, State 1 Can't update a TIMESTAMP column.
锁定被请求的行
Oracle用FOR UPDATE子句来锁定在SELECT命令中指定的行。在Microsoft SQL Server中,你不需要使用它的等价子句,因为这是一个缺省行为。
行合计和计算子句
SQL Server的COMPUTE子句用来生成行合计函数(SUM、AVG、MIN、MAX、以及COUNT),这些函数看起来好象是查询结果的附加行。这允许你看到一组结果的详情和汇总。你可以为一个子群(subgroups)计算汇总值,还可以为同一组计算更多的合计函数。
Oracle的SELECT命令语法不支持COMPUTE子句。但是,SQL Server的COMPUTE子句就像在Oracle的SQL*Plus查询工具中能找到的COMPUTE命令一样的工作。
连接子句(Join clauses)
Microsoft SQL Server 7.0允许在一个连接子句中连接多达256个表,包括临时的和永久的表。在Oracle中,没有连接限制。
在Oracle中使用外部连接时,外部连接操作符(+)典型的放置在子列(foreign key)的后面。(+)依靠少数几个唯一值来识别该列。除非子列允许空值,否则总是这样的。如果子列允许空值,则(+)被放置在父列(PRIMARY KEY或者UNIQUE约束)上。你不能把(+)同时放在等号(=)的两边。
用SQL Server,你可以使用(*=)和(=*)外部连接操作符。(*)用来标识一个有很多唯一值的列。如果子列不允许空值,则(*)被放在等号的父列一边。在Oracle中,(*)的放置正好相反。不能把(*)同时放在等号的两边。
(*=)和(=*)被认为是传统的连接操作符。SQL Server也支持下面列出的SQL-92标准的连接操作符。建议你使用这种语法。SQL-92标准语法比(*)操作符更强大,限制更小。
Join操作
描述
CROSS JOIN
这是两个表的交叉产物。如果在一个旧式的连接中没有指定WHERE子句,则返回同一行。在Oracle中,这种类型的连接叫做笛卡儿连接。
INNER
该连接指定返回所有的内部行。任何不匹配的行将被丢弃。该连接同一个标准的Oracle表连接是一样的。
LEFT[OUTER]
这种类型的连接指定返回右边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。
RIGHT[OUTER]
这种类型的连接指定返回左边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。
FULL [OUTER]
如果来自任一表的一行不匹配选择标准,指定该行被包括到结果集中,并且它的符合其它表的输出列被设定为NULL。这和把Oracle外部连接操作符放在“=”的两端是一样的(col1(+) = col2(+)),而在Oracle中,这是不允许的。
下面的例子返回所有学生都要上的课程的一个清单。在学生表和年级表之间定义的外部连接允许显示所有的学生,甚至那些没有参加任何课程的学生。在课程表上也有一个外部连接,该连接返回课程名字。如果课程表上没有加上外部连接,则不会返回那些没有参加任何课程的学生,因为他们的课程代码(CCDOE)是空值。
Oracle
Microsoft SQLServer
SELECT S.SSN AS SSN,
FNAME, LNAME
FROM STUDENT_ADMIN.STUDENT S,
DEPT_ADMIN.CLASS C,
STUDENT_ADMIN.GRADE G
WHERE S.SSN = G.SSN(+)
AND G.CCODE = C.CCODE(+)
SELECT S.SSN AS SSN,
FNAME, LNAME
FROM STUDENT_ADMIN.GRADE G
RIGHT OUTER JOIN
STUDENT_ADMIN.STUDENT S
ON G.SSN = S.SSN
LEFT OUTER JOIN
DEPT_ADMIN.CLASS C
ON G.CCODE = C.CCODE
用SELECT语句做表名
Microsoft SQL Server和Oracle都支持在执行查询时用SELECT语句作为表源。SQL Server需要一个别名(alias);而在Oracle中是否使用别名是可选的。
Oracle
Microsoft SQL
SELECT SSN, LNAME, FNAME,
TUITION_PAID, SUM_PAID
FROM STUDENT_ADMIN.STUDENT,
(SELECT SUM(TUITION_PAID) SUM_PAID FROM STUDENT_ADMIN.STUDENT)
SELECT SSN, LNAME, FNAME,
TUITION_PAID, SUM_PAID
FROM STUDENT_ADMIN.STUDENT,
(SELECT SUM(TUITION_PAID) SUM_PAID FROM STUDENT_ADMIN.STUDENT) SUM_STUDENT
读取和修改BLOBs
Microsoft SQL Server用text和image列来实现二进制大对象(binary large objects,BLOBs)。Oracle则用LONG和LONG RAW列来实现BLOBs。在Oracle中,SELECT命令可以查询LONG和LONG RAW列的值。
在SQL Server中,你可以使用标准的Transact-SQL语句或者专门的READTEXT语句来读取text和image列中的数据。READTEXT语句允许你读取text和image列的一部分。Oracle没有为LONG 和LONG RAW提供等价的语句。
READTEXT语句利用了一个text_pointer,该指针可以用TEXTPTR函数获取。TEXTPTR函数返回一个指向特定行中的text或者image的指针,如果查询有多于一行返回的话,则返回指向最后一行中的text或者image的指针。由于TEXTPTR返回的是一个16字节的二进制字符串,所以最好是声明一个内部变量来保持该文本指针,然后在READTEXT中使用这个变量。
READTEXT语句说明了有几个字节要返回。位于@@TEXTSIZE函数中的值,限制了返回的字符或者字节的数量,如果该值小于READTEXT声明的值,就用后者来代替。
SET语句可以用TEXTSIZE参数来说明以字节为单位的由一个SELECT语句返回的文本数据的尺寸。如果你设置一个大小为0的TEXTSIZE,则该尺寸就重设为缺省值(4 KB)。设置TEXTSIZE对@@TEXTSIZE函数有影响。当SQL_MAX_LENGTH 语句选项改变的时候,SQL Server ODBC自动设置TEXTSIZE参数。
在Oracle中,用UPDATE和INSERT命令来改变LONG和LONG RAW列中的值。在SQL Server,你可以用标准的UPDATE和INSERT语句,或者也可以用UPDATETEXT和WRITETEXT语句。UPDATETEXT和WRITETEXT都允许一个nonlogged选项,而且UPDATETEXT还允许对文本或者图形列的部分更新。
UPDATETEXT可以用来代替已有的数据,删除已有的数据,或者插入新数据。新插入的数据可以是一个常数值,表名,列名或者文本指针。
WRITETEXT语句完全覆盖它所影响的列中的任何已有的数据。用WRITETEXT来替换文本数据,用UPDATETEXT来修改文本数据。因为UPDATETEXT语句只修改一个文本或者图形值的一部分而不是全部的值,所以UPDATETEXT语句更灵活一些。
欲了解详细信息,请参阅SQL Server联机手册。
函数
本节中的表显示了Oracle和SQL Server 的scalar-valued和合计函数之间的关系。尽管名字是一样的,很重要的一点是注意到函数参数的个数和类型之间的区别。那些只有Microsoft SQL Server提供的函数在这个清单中没有提及,因为本章限制在使现存的Oracle应用程序的移植工作更容易。例如,这些函数不被Oracle支持:角度(DEGREES),PI(PI),和随机数(RAND)
数字/数学函数
下面是Oracle支持的数字/数学函数以及它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
绝对值
ABS
ABS
Arc cosine
ACOS
ACOS
Arc sine
ASIN
ASIN
Arc tangent of n
ATAN
ATAN
Arc tangent of n and m
ATAN2
ATN2
Smallest integer >= value
CEIL
CEILING
Cosine
COS
COS
Hyperbolic cosine
COSH
COT
Exponential value
EXP
EXP
Largest integer <= value
FLOOR
FLOOR
Natural logarithm
LN
LOG
Logarithm, any base
LOG(N)
N/A
Logarithm, base 10
LOG(10)
LOG10
Modulus (remainder)
MOD
USE MODULO (%) OPERATOR
Power
POWER
POWER
Random number
N/A
RAND
Round
ROUND
ROUND
Sign of number
SIGN
SIGN
Sine
SIN
SIN
Hyperbolic sine
SINH
N/A
Square root
SQRT
SQRT
Tangent
TAN
TAN
Hyperbolic tangent
TANH
N/A
Truncate
TRUNC
N/A
Largest number in list
GREATEST
N/A
Smallest number in list
LEAST
N/A
Convert number if NULL
NVL
ISNULL
字符函数
下面是Oracle支持的字符函数和它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
把字符转换为ASCII
ASCII
ASCII
字串连接
CONCAT
(expression + expression)
把ASCII转换为字符
CHR
CHAR
返回字符串中的开始字符(左起)
INSTR
CHARINDEX
把字符转换为小写
LOWER
LOWER
把字符转换为大写
UPPER
UPPER
填充字符串的左边
LPAD
N/A
清除开始的空白
LTRIM
LTRIM
清除尾部的空白
RTRIM
RTRIM
字符串中的起始模式(pattern)
INSTR
PATINDEX
多次重复字符串
RPAD
REPLICATE
字符串的语音表示
SOUNDEX
SOUNDEX
重复空格的字串
RPAD
SPACE
从数字数据转换为字符数据
TO_CHAR
STR
子串
SUBSTR
SUBSTRING
替换字符
REPLACE
STUFF
将字串中的每个词首字母大写
INITCAP
N/A
翻译字符串
TRANSLATE
N/A
字符串长度
LENGTH
DATELENGTH or LEN
列表中最大的字符串
GREATEST
N/A
列表中最小的字符串
LEAST
N/A
如果为NULL则转换字串
NVL
ISNULL
日期函数
下面是Oracle支持的日期函数和它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
日期相加
(date column +/- value) or
ADD_MONTHS
DATEADD
两个日期的差
(date column +/- value) or
MONTHS_BETWEEN
DATEDIFF
当前日期和时间
SYSDATE
GETDATE()
一个月的最后一天
LAST_DAY
N/A
时区转换
NEW_TIME
N/A
日期后的第一个周日
NEXT_DAY
N/A
代表日期的字符串
TO_CHAR
DATENAME
代表日期的整数
TO_NUMBER
(TO_CHAR))
DATEPART
日期舍入
ROUND
CONVERT
日期截断
TRUNC
CONVERT
字符串转换为日期
TO_DATE
CONVERT
如果为NULL则转换日期
NVL
ISNULL
转换函数
下面是Oracle支持的转换函数和它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
数字转换为字符
TO_CHAR
CONVERT
字符转换为数字
TO_NUMBER
CONVERT
日期转换为字符
TO_CHAR
CONVERT
字符转换为日期
TO_DATE
CONVERT
16进制转换为2进制
HEX_TO_RAW
CONVERT
2进制转换为16进制
RAW_TO_HEX
CONVERT
其它行级别的函数
下面是Oracle支持的其它行级别的函数以及它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
返回第一个非空表达式
DECODE
COALESCE
当前序列值
CURRVAL
N/A
下一个序列值
NEXTVAL
N/A
如果exp1 = exp2, 返回null
DECODE
NULLIF
用户登录账号ID数字
UID
SUSER_ID
用户登录名
USER
SUSER_NAME
用户数据库ID数字
UID
USER_ID
用户数据库名
USER
USER_NAME
当前用户
CURRENT_USER
CURRENT_USER
用户环境(audit trail)
USERENV
N/A
在CONNECT BY子句中的级别
LEVEL
N/A
合计函数
下面是Oracle支持的合计函数和它们的Microsoft SQL Server等价函数。
函数
Oracle
Microsoft SQLServer
Average
AVG
AVG
Count
COUNT
COUNT
Maximum
MAX
MAX
Minimum
MIN
MIN
Standard deviation
STDDEV
STDEV or STDEVP
Summation
SUM
SUM
Variance
VARIANCE
VAR or VARP
条件测试
Oracle的DECODE语句和Microsoft SQL Server的CASE表达式都执行条件测试。当test_value中的值和后面的任何表达式匹配的时候,相关的值就返回。如果没有找到任何匹配的值,就返回default_value。如果没有指定default_value,在没有匹配的时候,DECODE和CASE都返回一个NULL。下表显示了该语句的语法,同时给出了转换DECODE命令的示例。
Oracle
Microsoft SQL
DECODE (test_value,
expression1, value1
[[,expression2, value2] […]]
[,default_value]
)
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(DECODE(grade
,'A', 4
,'A+', 4.3
,'A-', 3.7
,'B', 3
,'B+', 3.3
,'B-', 2.7
,'C', 2
,'C+', 2.3
,'C-', 1.7
,'D', 1
,'D+', 1.3
,'D-', 0.7
,0)),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN
CASE input_expression
WHEN when_expression THEN result_expression
[[WHEN when_expression THEN result_expression] [...]]
[ELSE else_result_expression]
END
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(CASE grade
WHEN 'A' THEN 4
WHEN 'A+' THEN 4.3
WHEN 'A-' THEN 3.7
WHEN 'B' THEN 3
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
END),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN
CASE表达式可以支持用SELECT语句执行布尔测试,这是DECODE命令所不允许的。欲了解关于CASE表达式的详细信息,请参阅SQL Server联机手册。
把值转换为不同的数据类型
Microsoft SQL Server的CONVERT和CAST函数都是多目标转换函数。它们提供了相似的功能,把一种数据类型的表达式转换为另一种数据类型的表达式,并且支持多种专门数据的格式。
CAST(expression AS data_type)
CONVERT (data type[(length)], expression [, style])
CAST是一个SQL-92标准的函数。这些函数执行同Oracle的TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW以及RAWTOTEXT函数相同的功能。
这里所指的数据类型是任何表达式将被转换成为的系统数据类型。不能使用用户定义的数据类型。长度参数是可选的,该参数用于char、varchar、binary以及varbinary数据类型。允许的最大长度是8000。
转换
Oracle
Microsoft SQLServer
字符到数字
TO_NUMBER('10')
CONVERT(numeric, '10')
数字到字符
TO_CHAR(10)
CONVERT(char, 10)
字符到日期
TO_DATE('04-JUL-97')
TO_DATE('04-JUL-1997',
'dd-mon-yyyy')
TO_DATE('July 4, 1997',
'Month dd, yyyy')
CONVERT(datetime, '04-JUL-97')
CONVERT(datetime, '04-JUL-1997')
CONVERT(datetime, 'July 4, 1997')
日期到字符
TO_CHAR(sysdate)
TO_CHAR(sysdate, 'dd mon yyyy')
TO_CHAR(sysdate, 'mm/dd/yyyy')
CONVERT(char, GETDATE())
CONVERT(char, GETDATE(), 106)
CONVERT(char, GETDATE(), 101)
16进制到2进制
HEXTORAW('1F')
CONVERT(binary, '1F')
2进制到16进制
RAWTOHEX
(binary_column)
CONVERT(char, binary_column)
请注意字符串是怎样转换为日期的。在Oracle中,缺省的日期格式模型是“DD-MON-YY”如果你使用任何其它格式,你必须提供一个合适的日期格式模型。CONVERT函数自动转换标准日期格式,不需要任何格式模型。
从日期转换到字符串时,CONVERT函数的缺省输出是“dd mon yyyy hh:mm:ss:mmm(24h)”。用一个数字风格代码来格式化输出,使它能输出为其它类型的日期格式模型。欲了解CONVERT函数的详细信息,请参阅SQL Server联机手册。
下表显示了Microsoft SQL Server日期的缺省输出。
Without Century
With Century
Standard
Output
-
0 or 100 (*)
Default
mon dd yyyy hh:miAM (or PM)
1
101
USA
mm/dd/yy
2
102
ANSI
yy.mm.dd
3
103
British/French
dd/mm/yy
4
104
German
dd.mm.yy
5
105
Italian
dd-mm-yy
6
106
-
dd mon yy
7
107
-
mon dd, yy
8
108
-
hh:mm:ss
-
9 or 109 (*)
Default milliseconds
mon dd yyyy hh:mi:ss:mmm (AM or PM)
10
110
USA
mm-dd-yy
11
111
Japan
yy/mm/dd
12
112
ISO
yymmdd
-
13 or 113 (*)
Europe default
dd mon yyyy hh:mm:ss:mmm(24h)
14
114
-
hh:mi:ss:mmm(24h)
用户定义函数
Oracle PL/SQL函数可以在Oracle SQL语句中使用。在Microsoft SQL Server中一般可以通过其它方式来实现同样的功能。
在SQL Server中可以用表中给出的查询来代替。
Oracle
Microsoft SQLServer
SELECT SSN, FNAME, LNAME, ) TUITION_PAID,
TUITION_PAID/GET_SUM_
MAJOR(MAJOR)
AS PERCENT_MAJOR
FROM STUDENT_ADMIN.STUDENT
SELECT SSN, FNAME, LNAME, TUITION_PAID, TUITION_PAID/SUM_MAJOR AS PERCENT_MAJOR
FROM STUDENT_ADMIN.STUDENT,
(SELECT MAJOR, SUM(TUITION_PAID) SUM_MAJOR
FROM STUDENT_ADMIN.STUDENT
GROUP BY MAJOR) SUM_STUDENT
WHERE STUDENT.MAJOR = SUM_STUDENT.MAJOR
CREATE OR REPLACE FUNCTION GET_SUM_MAJOR
(INMAJOR VARCHAR2) RETURN NUMBER
AS SUM_PAID NUMBER;
BEGIN
SELECT SUM(TUITION_PAID) INTO SUM_PAID
FROM STUDENT_ADMIN.STUDENT
WHERE MAJOR = INMAJOR;
RETURN(SUM_PAID);
END GET_SUM_MAJOR;
No CREATE FUNCTION syntax is required; use CREATE PROCEDURE syntax.
比较操作符
Oracle和Microsoft SQL Server的比较操作符几乎是一样的。
算符
Oracle
Microsoft SQLServer
等于
(=)
(=)
大于
(>)
(>)
小于
(<)
(<)
大于或等于
(>=)
(>=)
小于或等于
(<=)
(<=)
不等于
(!=, <>, ^=)
(!=, <>, ^=)
不大于,不小于
N/A
!> , !<
在集合中任意成员中
IN
IN
不在集合中的任何成员中
NOT IN
NOT IN
集合中的任意值
ANY, SOME
ANY, SOME
提交集合中的所有值
!= ALL, <> ALL, < ALL,
> ALL, <= ALL, >= ALL, !=SOME, <>SOME,
<SOME, >SOME,
<=SOME, >=SOME
!= ALL, <> ALL, < ALL,
> ALL, <= ALL, >= ALL, !=SOME, <>SOME,
<SOME, >SOME,
<=SOME, >=SOME
像模式(Like pattern)
LIKE
LIKE
不像模式(Not like pattern)
NOT LIKE
NOT LIKE
X和y之间的值
BETWEEN x AND y
BETWEEN x AND y
不在x和y之间的值
NOT BETWEEN
NOT BETWEEN
值存在
EXISTS
EXISTS
值不存在
NOT EXISTS
NOT EXISTS
值{为|不为}空
IS NULL, IS NOT NULL
Same. Also = NULL,
!=NULL for backward compatibility (not recommended).
模式匹配
SQL Server的LIKE关键字提供了有用的通配符搜索功能,这个功能在Oracle中不支持。除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server还支持([ ])和([^])通配符。
([ ])字符用来查询在一个范围内的所有单个字符。例如,如果你需要查询包含一个从a到f的字符的数据,你可以这样写:“LIKE '[a-f]'”或者“LIKE '[abcdef]'”。这些附加的通配符的有效性在下表中给出。
Oracle
Microsoft SQL
SELECT * FROM STUDENT_ADMIN.STUDENT
WHERE LNAME LIKE 'A%'
OR LNAME LIKE 'B%'
OR LNAME LIKE 'C%'
SELECT * FROM STUDENT_ADMIN.STUDENT
WHERE LNAME LIKE '[ABC]%'
[^]通配符用来标记那些不在特定范围内的字符。例如,如果除了a到f以外的所有字符都是可以接受的,你可以这样书写:LIKE '[^a - f]'或者LIKE '[^abcdef]'。
欲了解关于LIKE关键字的详细信息,请参阅SQL Server联机手册。