为什么 equal 运算符和 like 运算符之间的相等比较存在差异?

2023-12-09

SELECT au_lname, au_fname  
FROM authors
WHERE au_lname = 'Green '


au_lname                                 au_fname
---------------------------------------- --------------------
Green                                    Marjorie
  
SELECT au_lname, au_fname
FROM authors
WHERE au_lname LIKE 'Green '


au_lname                                 au_fname
---------------------------------------- --------------------
  

谁能解释一下为什么第二个查询没有返回预期的行?


这显然是标准的一个怪癖。不妨明确一下:

SQL Server 遵循 ANSI/ISO SQL-92 规范(第 8.2 节, ,一般规则 #3) 关于如何将字符串与空格进行比较。 ANSI 标准要求 所用字符串的填充 进行比较,以便它们的长度 在比较它们之前先匹配。这 padding直接影响语义 WHERE 和 HAVING 子句谓词 和其他 Transact-SQL 字符串 比较。例如,Transact-SQL 认为字符串 'abc' 和 'abc ' 是等效的对于大多数比较 运营。

此规则的唯一例外是 LIKE 谓词。当右侧 LIKE 谓词表达式具有以下特征: 带有尾随空格的值,SQL 服务器不会将这两个值填充到 比较前长度相同 发生。因为其目的是 LIKE 谓词,根据定义,是 更方便模式搜索 比简单的字符串相等测试, 这并不违反本节 ANSI SQL-92 规范 之前提到。

See here, here and here.

奇怪的是——考虑到“平等”和“喜欢”这两个词,我本以为后者会更自由。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 equal 运算符和 like 运算符之间的相等比较存在差异? 的相关文章

  • Sql Server 复制需要实际的服务器名称才能连接到服务器

    当我想要创建新的发布或订阅时 我收到以下消息 Sql Server 复制需要实际的服务器名称才能连接到服务器 不支持通过服务器别名 IP 地址或任何其他备用名称进行连接 指定实际的服务器名称 有谁知道我应该做什么 我在以下链接中找到了解决方
  • SQL Server 2008-获取表约束

    你能帮我构建一个查询 检索所有表中的约束 每个表中的约束计数 并显示NULL对于没有任何约束的表 这是我到目前为止所拥有的 Select SysObjects Name As Constraint Name Tab Name as Tabl
  • SQL Server 2016升级到13.0.15700.28版本后频繁出现System.OutOfMemoryException

    我在具有多个显示器 16 GB DDR4 RAM 4 Ghz I7 GTX 970 的开发盒上运行 Windows 10 Pro 64 位 我使用 SQL Server 2016 Developer Edition 和 VS 2015 En
  • 链接到 SQL 表时如何在 Access 中获得“查找”功能?

    我正在构建一个 SQL 数据库 该数据库将具有 Access 2010 前端 我希望在 Access 中查找某些字段 即用户单击 Access 中的字段并填充下拉列表 在 Access 中使一个字段成为另一个表的查找相当简单 但我似乎不知道
  • 更改 SQL Server 中的身份种子(永久!)

    有没有办法永久更改身份列的身份种子 使用 DBCC CHECKIDENT 似乎只是设置了最后一个值 如果表被截断 所有值都会重置 dbcc checkident Test SeedIdent reseed 1000 select name
  • 使用 HTTP 访问数据库对象

    是否可以使用 HTTP 访问数据库对象SQL Server 2012它的完成方式是使用SQL Server 2000 我提到了下面的文章 但它是关于SQL Server 2000 使用 HTTP 访问数据库对象 http technet m
  • 对不同记录进行 PIVOT 查询

    我有下表 Id Code percentage name name1 activity 1 Prashant 43 43 James James Running 1 Prashant 70 43 Sam Sam Cooking 1 Pras
  • 无法将 null 值插入列...当值不为 null 时

    在我的 C 代码中 我在数据库中有一个插入 但它引发了异常 无法将 NULL 值插入表 Moroccanoil Replicated dbo Boxes 的 BoxID 列 列不允许为空 插入失败 然而 在调试这段代码时 我发现该框实际上不
  • GRANT EXECUTE 所需的权限

    我正在为需要能够创建和删除过程但也向其他用户授予执行权限的用户创建一个组 GRANT CREATE PROCEDURE TO xxx xxx GRANT ALTER ON SCHEMA dbo TO xxx xxx 但是 我需要向组授予什么
  • SQL Case 语句会失败吗?

    有没有办法让 SQL 中的 CASE 语句像 C 中的 case 语句一样失败 我不想做的是下面的例子 但如果这是我唯一的选择 我想我会选择它 EXAMPLE NewValue CASE WHEN MyValue 1 THEN CAST M
  • 查找SQL记录中的并发用户数

    我有以下结构的表 UserID StartedOn EndedOn 1 2009 7 12T14 01 2009 7 12T15 01 2 2009 7 12T14 30 2009 7 12T14 45 3 2009 7 12T14 47
  • 查看tomcat服务器的连接数

    我在 Tomcat Server 5 5 17 上部署了一个 Java Java EE Web 应用程序 我想知道连接到服务器的客户端数量 我们怎样才能找到它呢 最可靠的方法是搜索ip addr of srv port in netstat
  • 如何使用存储过程 SQL SERVER 2008 R2(mssql) 插入 PHP 数组值

    我有这个数组 REV Array 0 gt 240 1 gt 241 2 gt 242 3 gt 243 4 gt 249 我现在使用下面的代码进行插入 将每个数组的元素存储在带有 id userID Type 和 Date 的行中 if
  • 如何在 Windows 7 - 64 位中安装 IBM db2 ODBC 驱动程序?

    我需要从本地 SQL Server 2008 R2 连接到远程 DB2 我不想使用链接服务器 因此 我正在搜索下载并尝试安装 IBM DB2 驱动程序 因为主机集成服务器附带的用于 DB2 的 Microsoft ODBC 驱动程序非常昂贵
  • ROUTINE_NAME 和 SPECIFIC_NAME 之间有什么区别?

    在 INFORMATION SCHEMA ROUTINES 视图中 存在 ROUTINE NAME 和 SPECIFIC NAME 按照MSDN http msdn microsoft com en us library ms188757
  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE
  • 如何在 SQL Server 会话中设置自动提交?

    如何在 SQL Server 会话中设置自动提交 您可以通过将implicit transactions设置为OFF来打开自动提交 SET IMPLICIT TRANSACTIONS OFF 当设置为ON时 返回隐式事务模式 在隐式事务模式
  • 如何从表中选择层次结构中的最低级别

    我有一个具有父 子关系的表 Table A Column Id int Column Parent Id int Column Description text 一组示例数据如下 999 NULL Corp 998 999 Div1 997
  • 为什么实体框架 6 在插入后不只选择scope_identity()?

    当您使用 EF 6 1 保存实体时 将生成并执行以下 SQL 代码 exec sp executesql N INSERT dbo Customers Name FirstName VALUES 0 1 SELECT CustomerId
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做

随机推荐