gpt4 book ai didi

sql-server - T-SQL varchar比较问题

转载 作者:行者123 更新时间:2023-12-02 05:39:54 26 4
gpt4 key购买 nike

我正在使用 MS Sql 2005。

为什么这会给我正确的结果(返回 169 行)...

select
*
from
[import_Data]
where
[import_Data].name not in
(
select
[import_Data].name
from
[import_Data]
inner join [resource] on [import_Data].name = [resource].name
where
[import_Data].ProviderTypeID = 4
and [resource].IsDeleted = 0
)
and [import_Data].ProviderTypeID = 4

但这不会(返回 0 行)...

select 
*
from
[import_Data]
where
[import_Data].name not in
(
select
[resource].name
from
[resource]
where
IsDeleted = 0
)
and [import_Data].ProviderTypeID = 4

name 列之间的唯一区别是 [resource].namevarchar(500)[import_Data] .namevarchar(300)

最佳答案

我的猜测是您的资源表中有一个空的 resource.name,这会导致所有比较都失败。为什么空值会导致问题?根据“Guru's Guid to TSQL”,我的解释是“ANSI 准则规定,将相等值与 NULL 进行比较的表达式始终返回 NULL。”所以列表中的任何 null 都会抛出整个问题。

在您的第一个查询中,您的内部联接排除了那些空值。

所以你有三个选择

  • 不要使用 NOT IN,使用 NOT EXISTS
  • 在 resource.name 上使用 ISNULL 来消除空值
  • 通过将 ANSI_NULLS 设置为 OFF 来更改空值处理行为。

使用相关子查询的不存在示例(警告代码)

SELECT *
FROM [import_Data]
WHERE NOT EXISTS(
select [resource].name from [resource] where IsDeleted = 0 AND [resource].name = [import_Data].name
)
AND [import_Data].ProviderTypeID = 4

关于sql-server - T-SQL varchar比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341619/

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