当前位置: 首页 > 面试题库 >

SQL Server WHERE条件不考虑空格

訾淇
2023-03-14
问题内容

我的名字和姓氏后面都有空格。我有两个SQL查询-即使我没有空格搜索,第一个查询也会返回结果。(第一个查询返回了不想要的结果)。

  1. 此行为在所有版本的SQL Server中都一致吗?
  2. 这是已知行为吗?难道在任何地方记录msdnSQL Server 2008 R2

代码

DECLARE @NameTable TABLE (first_name varchar(40),last_name varchar(40))
INSERT INTO @NameTable VALUES ('STEVEN    ','STANLEY   ');


--QUERY 1
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (first_name = 'STEVEN')
AND (last_name = 'STANLEY')


--QUERY 2       
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(first_name,'')+' ' +ISNULL(last_name,'') ) = 'STEVEN STANLEY')

--QUERY 3   (With LTRIM and RTRIM)    
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(LTRIM(RTRIM(first_name)),'')+' ' +ISNULL(LTRIM(RTRIM(last_name)),'') ) = 'STEVEN STANLEY')

问题答案:

请参阅http://support.microsoft.com/kb/316626

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

该规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧具有带尾随空格的值时,在进行比较之前,SQL
Server不会将两个值填充为相同的长度。因为按照定义,LIKE谓词的目的是为了促进模式搜索,而不是简单的字符串相等性测试,所以这不违反前面提到的ANSI
SQL-92规范的部分。

如果要避免这种情况,可以添加一个加法条件,如下所示

参考:DataLength

SELECT first_name AS [FirstName], last_name AS [LastName],first_name+last_name,LEN(first_name+last_name)
FROM  @NameTable A
WHERE (first_name = 'STEVEN') and DATALENGTH(first_name)=DATALENGTH(RTRIM(first_name))
AND (last_name = 'STANLEY') and DATALENGTH(last_name)=DATALENGTH(RTRIM(last_name))


 类似资料:
  • 我正在尝试Flink对从CSV文件加载的(排序的)时间戳事件进行基本聚合。 我告诉Flink使用活动时间: 然后我在KeyedStream上使用一个时间窗口 问题是,将窗口更改为10分钟实际上会在该时间过后打印结果! 我的理解是,通过明确告诉Flink使用时间戳字段作为事件时间,操作将不依赖于机器上的实时性。我错过什么了吗?

  • 我在java中有以下正则表达式- 但这仍然匹配“”。 整个代码-

  • 我目前在使用PrimeFaces 4.0的dataTable中的列的呈现属性上有一个小问题。我的表中有一列不应该总是显示,所以我使用了它的呈现属性并从我的支持bean中获取值。这是第6列也是最后一列。dataTable位于一个p:对话框中,该对话框将显示在方法的末尾。 渲染属性似乎工作正常,因为当showColumn为false时,该列将不会显示,反之亦然,但存在一个问题。如图所示,“未找到记录”

  • 这节包含一些杂项:‘做'与'不做'。 不要通过宏替换来改变语法。这将导致程序对于所有人都是难以理解的,除了那个肇事者。 不要在需要离散值的地方使用浮点变量。使用一个浮点数作为循环计数器无疑是搬起石头砸自己的脚。总是用<=或>=测试浮点数,对它们永远不要 用精确比较(==或!=)。 编译器也有bug。常见且高发的问题包括结构体赋值和位字段。你无法泛泛的预测一个编译器都有哪些bug。但你可以在程序中避

  • 我观察到每次发出“编译”任务时,SBT都会编译所有源文件,而不管上次编译后的时间戳如何。以下是我的build.sbt文件: 以下是我的项目结构(忽略的项目和目标目录): 出于测试目的,这两个源文件只是空的对象定义。 当我输入“sbt编译”时,我得到了以下信息: 我可以在目标目录中找到新编译的类文件。 没有修改任何源文件,一分钟后,再次键入“sbt compile”,我得到了相同的信息和类文件,只是

  • 我使用Spring安全,我试图允许一个帖子不需要连接。 所以在一个类谁扩展 WebSecurityConfigurerAdapter 当我试着呼叫这个控制器时 ....} 我明白了 只是不明白为什么当我指定允许的时候,帖子是安全的