如果我使用“ =”,为什么SQL不返回值,但是如果我使用“ like”,为什么不返回值?

时间:2018-08-29 07:44:51

标签: sql sql-server

这是我的查询:
(不会返回值)

select * from T_VoucherHeaderEntry
where Vhe_VoucherNo = 'APV-1808-00160'

(将返回一个值)

Select * from T_VoucherHeaderEntry where Vhe_VoucherNo like 'APV-1808-00160%'

我尝试修剪我的第一个查询,但没有用。

enter image description here

2 个答案:

答案 0 :(得分:1)

您似乎在存储的数据中还有其他控制字符,特别是回车和换行。这突出显示了问题,最终查询找到了当前受此 1

影响的所有行:
;declare @t table (Val1 varchar(20))
insert into @t(Val1) values ('abc
    '),('def')

select * from @t where Val1 = 'abc'
select * from @t where Val1 like 'abc%'

select * from @t where Val1 like '%
%'

因此,请修复您选择的那些行。接下来,在此列上添加CHECK约束:

ALTER TABLE T_VoucherHeaderEntry
ADD CONSTRAINT CK_T_VoucherHeaderEntry_NoExoticChars
CHECK (Vhe_VoucherNo not like '%[^-A-Za-z0-9]%')

(这表示为双重否定,表示我们要不允许在提供的范围内输入任何字符。我们必须将-放在第一个字符,以便按字面意义进行解释,而不是作为范围分隔符)

最后更新您的应用程序,以免首先尝试插入此类伪造数据。


1 第三个查询标识那些受CR / LF问题特别影响的人。对于更通用的方法,一旦确定了要在检查约束中指定的适当字符范围,则使用相同方法的变体将查找不满足检查约束的行,以供您修复。

答案 1 :(得分:0)

如果您的Vde_VoucherNo列包含此'APV-1808-00160'值,则绝对可以在下面工作并返回数据

select * from T_VoucherHeaderEntry
where Vhe_VoucherNo = 'APV-1808-00160'

如果列值中有空格,则可以使用修剪功能

select * from T_VoucherHeaderEntry
where trim(Vhe_VoucherNo) = 'APV-1808-00160'

但是,如果您的列包含此值的模式APV-1808-00160,那么like将会起作用,这是您的第二个查询

Select * from T_VoucherHeaderEntry
where Vhe_VoucherNo like 'APV-1808-00160%'

BTW注意到两个查询来自两个不同的表,所以这可能也是原因