搜索条件 (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

一个或多个使用逻辑运算符 AND的谓词的组合, OR以及 NOT

Transact-SQL 语法约定

语法

SQL Server、Azure SQL 数据库和Azure SQL 托管实例的语法。

<search_condition> ::=
    MATCH (<graph_search_pattern>) | <search_condition_without_match> | <search_condition> AND <search_condition>

<search_condition_without_match> ::=
    { [ NOT ] <predicate> | ( <search_condition_without_match> ) }
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition_without_match> ) } ]
[ ...n ]

<predicate> ::=
    { expression { = | <> | != | > | >= | !> | < | <= | !< } expression
    | string_expression [ NOT ] LIKE string_expression
  [ ESCAPE 'escape_character' ]
    | expression [ NOT ] BETWEEN expression AND expression
    | expression IS [ NOT ] NULL
    | expression IS [ NOT ] DISTINCT FROM
    | CONTAINS
  ( { column | * } , '<contains_search_condition>' )
    | FREETEXT ( { column | * } , 'freetext_string' )
    | expression [ NOT ] IN ( subquery | expression [ , ...n ] )
    | expression { = | < > | != | > | >= | ! > | < | <= | ! < }
  { ALL | SOME | ANY } ( subquery )
    | EXISTS ( subquery )     }

<graph_search_pattern> ::=
    { <node_alias> {
                    { <-( <edge_alias> )- }
                    | { -( <edge_alias> )-> }
                    <node_alias>
                   }
    }

<node_alias> ::=
    node_table_name | node_table_alias

<edge_alias> ::=
    edge_table_name | edge_table_alias

Azure Synapse Analytics 和并行数据仓库的语法。

< search_condition > ::=
    { [ NOT ] <predicate> | ( <search_condition> ) }
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ]
[ ...n ]

<predicate> ::=
    { expression { = | <> | != | > | >= | < | <= } expression
    | string_expression [ NOT ] LIKE string_expression
    | expression [ NOT ] BETWEEN expression AND expression
    | expression IS [ NOT ] NULL
    | expression [ NOT ] IN (subquery | expression [ , ...n ] )
    | expression [ NOT ] EXISTS (subquery)
    }

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

<search_condition>

指定语句、查询表达式或子查询的结果集中 SELECT 返回的行的条件。 对于语句 UPDATE ,指定要更新的行。 对于语句 DELETE ,指定要删除的行。 Transact-SQL 语句搜索条件中可以包含的谓词数没有限制。

<graph_search_pattern>

指定图匹配模式。 有关此子句的参数的详细信息,请参阅 MATCH

NOT

对谓词指定的布尔表达式求反。 有关详细信息,请参阅 NOT

AND

将两个条件组合在一起,并计算结果TRUE为两个条件。TRUE 有关详细信息,请参阅 AND

OR

合并两个条件,并在任一条件为时计算 TRUE 结果 TRUE。 有关详细信息,请参阅 OR

<predicate>

返回TRUEFALSEUNKNOWN返回的表达式。 有关详细信息,请参阅 Predicates

expression

指定列名、常量、函数、变量、标量子查询或由运算符或子查询连接的列名、常量和函数的任意组合。 表达式还可以包含 CASE 表达式。

非 Unicode 字符串常量和变量使用与数据库的默认排序规则相对应的代码页。 仅使用非 Unicode 字符数据并引用 char、varchar 和 text 类型的非 Unicode 字符数据时,可能发生代码页转换 。 如果代码页不同于与数据库的默认排序规则对应的代码页,SQL Server 会将非 Unicode 字符串常量和变量转换为与引用列的排序规则相对应的代码页或指定的 COLLATE代码页。 如果 找到最适合映射 ,或者转换为默认替换字符,则新代码页中未找到的任何字符都将转换为类似的字符 ?

使用多个代码页时,字符常量可以带有大写字母 N前缀,并且可以使用 Unicode 变量来避免代码页转换。

= 运算符

用于测试两个表达式之间的相等性的运算符。

<> 运算符

用于测试两个表达式不相等条件的运算符。

!= 运算符

用于测试两个表达式不相等条件的运算符。

> 运算符

用于测试一个表达式大于另一个表达式的条件的运算符。

>= 运算符

用于测试一个表达式大于或等于另一个表达式的条件的运算符。

!> 运算符

用于测试一个表达式的条件的运算符不大于另一个表达式。

< 运算符

用于测试一个表达式的条件小于另一个表达式的运算符。

<= 运算符

用于测试一个表达式小于或等于另一个表达式的条件的运算符。

!< 运算符

用于测试一个表达式的条件的运算符不小于另一个表达式。

string_expression

字符字符串和通配符。

[ NOT ] 喜欢

指示后续字符串使用时要进行模式匹配。 有关详细信息,请参阅 LIKE

转义“escape_字符

允许在字符串中搜索通配符,而不是将其作为通配符使用。 escape_character 是放在通配符前表示此特殊用法的字符。

[ NOT ] 之间

指定值的包含范围。 用于 AND 分隔起始值和结束值。 有关详细信息,请参阅 BETWEEN

IS [ NOT ] NULL

根据使用的关键字,指定搜索 null 值或不为 null 的值。 具有按位或算术运算符的表达式的计算结果为 NULL 任一操作数 NULL

IS [ NOT ] DISTINCT FROM

比较两个表达式的相等性,并保证一个 true 或 false 结果,即使有一个或两个操作数。NULL 有关详细信息,请参阅 IS [NOT] DISTINCT FROM (Transact-SQL)

CONTAINS

在包含基于字符的数据的列中,搜索单个词和短语的精确或不精确(“模糊”)匹配项、在一定范围内相同的近似词以及加权匹配项。 此选项只能与语句一起使用 SELECT 。 有关详细信息,请参阅 CONTAINS

FREETEXT

在包含基于字符的数据的列中,搜索与谓词中的词的含义相符而非精确匹配的值,从而提供一种形式简单的自然语言查询。 此选项只能与语句一起使用 SELECT 。 有关详细信息,请参阅 FREETEXT

[ NOT ] IN

根据是在列表中包含还是排除某表达式,指定对该表达式的搜索。 搜索表达式可以是常量或列名,而列表可以是一组常量,更常用的是子查询。 将一组值用圆括号括起来。 有关详细信息,请参阅 IN

subquery

可以被视为受限SELECT语句,并且与语句SELECT中类似<query_expression>。 不允许子 ORDER BY 句和 INTO 关键字。 有关详细信息,请参阅 SELECT

ALL

与比较运算符和子查询一起使用。 当TRUE<predicate>为子查询检索到的所有值满足比较操作时,或者并非所有值都满足比较,或者FALSE当子查询不向外部语句返回任何行时,返回结果。 有关详细信息,请参阅 ALL

{ SOME | ANY }

与比较运算符和子查询一起使用。 TRUE<predicate>为子查询检索到的任何值满足比较操作时,或者当子查询中没有值满足比较时,或者FALSE当子查询中没有向外部语句返回任何行时,则返回该值。 否则,表达式为 UNKNOWN. 有关详细信息,请参阅 SOME |ANY

EXISTS

与子查询一起使用,用于测试是否存在子查询返回的行。 有关详细信息,请参阅 EXISTS

注解

逻辑运算符的优先顺序是 NOT(最高),然后是 AND,最后是 OR。 不过,可以在搜索条件内使用括号来表示优于此优先顺序的运算符。 根据查询优化器所做的选择,逻辑运算符的求值顺序可能有所不同。 有关逻辑运算符如何对逻辑值进行操作的详细信息,请参阅 ANDORNOT

示例

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

A. 将 WHERE 与 LIKE 和 ESCAPE 语法配合使用

下面的示例将搜索以下行,其中的 LargePhotoFileName 列包含字符 green_;由于 _ 是通配符,因此使用了 ESCAPE 选项。 如果未指定 ESCAPE 该选项,查询将搜索包含单词 green 后跟字符以外的任何单个字符 _ 的任何说明值。

USE AdventureWorks2022;
GO
SELECT *
FROM Production.ProductPhoto
WHERE LargePhotoFileName LIKE '%greena_%' ESCAPE 'a';

B. 将 WHERE 和 LIKE 语法与 Unicode 数据配合使用

下面的示例将使用 WHERE 子句检索美国 (US) 以外且所在城市的名称以 Pa 开头的所有公司的邮件地址。

USE AdventureWorks2022;
GO

SELECT AddressLine1,
    AddressLine2,
    City,
    PostalCode,
    CountryRegionCode
FROM Person.Address AS a
INNER JOIN Person.StateProvince AS s
    ON a.StateProvinceID = s.StateProvinceID
WHERE CountryRegionCode NOT IN ('US')
    AND City LIKE N'Pa%';

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

°C 将 WHERE 与 LIKE 配合使用

下面的示例将搜索以下行,其中的 LastName 列包含字符 and

-- Uses AdventureWorks

SELECT EmployeeKey,
    LastName
FROM DimEmployee
WHERE LastName LIKE '%and%';

D. 将 WHERE 和 LIKE 语法与 Unicode 数据配合使用

下面的示例使用 WHERE 子句对 LastName 列执行 Unicode 搜索。

-- Uses AdventureWorks

SELECT EmployeeKey,
    LastName
FROM DimEmployee
WHERE LastName LIKE N'%and%';