gpt4 book ai didi

sql-server - 在 T-SQL 中,为什么 Like 运算符不适用于变量但适用于文字?

转载 作者:行者123 更新时间:2023-12-03 02:16:08 24 4
gpt4 key购买 nike

这是脚本:

第一个脚本:

declare @a char(10) = 'AA%'
declare @b char(10) = 'AA001'

if @b LIKE @a
print 'Equals'
else
begin
print 'Not equals'
end

它打印:

Not Equals

我期望它打印Equals。但下面的脚本在条件中没有使用 @a :

第二个脚本:

declare @a char(10) = 'AA%'
declare @b char(10) = 'AA001'

if @b LIKE 'AA%'
print 'Equals'
else
begin
print 'Not equals'
end

打印

Equals

那么为什么第一个脚本认为它们不相等,但第二个脚本认为它们相等?

最佳答案

答案实际上很简单,但这是一个大问题:这是因为 char 类型。

如果我们要打印出 2 个变量:

print @a
print @b

输出将是(点表示空白):

AA%.......       
AA001.....

因此,第一个查询对两个变量执行 like ,并且尾随空白使其不相等,因为根据 MSDN ,从逻辑上讲,尾随空格(空格)很重要:

If a comparison in a query is to return all rows with the string LIKE 'abc' (abc without a space), all rows that start with abc and have zero or more trailing blanks are returned. + A string comparison using a pattern that contains char and varchar data may not pass a LIKE comparison because of how the data is stored.

第二个查询

第二个查询具有文字AA%,其隐式类型为varchar,并且自AA001(其类型为char code>) 将类似于 AA%,它会打印 Equals。为了重申文字的类型是 varchar,我使用了以下查询:

SELECT SQL_VARIANT_PROPERTY('AA%', 'BaseType')

返回varchar

<小时/>

更多信息

以下是来自 MSDN 的更多示例,以便进一步说明:

以下示例将本地 char 变量传递给存储过程,然后使用模式匹配查找姓氏以指定字符集开头的所有员工。

-- Uses AdventureWorks  

CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO

FindEmployee 过程中,不会返回任何行,因为每当名称包含的字符少于 20 个时,char 变量 (@EmpLName) 就会包含尾随空格。由于 LastName 列是 varchar,因此没有尾随空格。此过程失败,因为尾随空格很重要。但是,以下示例会成功,因为尾随空格不会添加到 varchar 变量中。

-- 使用 AdventureWorks

CREATE PROCEDURE FindEmployee @EmpLName varchar(20)  
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';

这是结果集:

FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)

关于sql-server - 在 T-SQL 中,为什么 Like 运算符不适用于变量但适用于文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43124119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com