gpt4 book ai didi

sql - COUNT() 函数与 NOT IN 子句结合使用 varchar 字段无法正常工作 (T-SQL)

转载 作者:行者123 更新时间:2023-12-02 16:22:00 25 4
gpt4 key购买 nike

当我试图计算没有由 select 语句指定的 varchar 值的行数时,我遇到了一个奇怪的情况。好吧,这对我来说也很困惑,所以让我给你举个例子:

假设我在“SomeTable”中有一个字段“MyField”,并且我想计算有多少行 MyField 值不属于由“SomeOtherTable”中的“MyOtherField”值定义的域。换句话说,假设我有 MyOtherField = {1, 2, 3},我想计算 MyField 值不为 1、2 或 3 的行数。为此,我将使用以下查询:

SELECT COUNT(*) FROM SomeTable   
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable))

它就像一个魅力。但请注意,MyField 和 MyOtherField 是 int 类型。如果我尝试运行完全相同的查询,除了 varchar 类型的字段之外,它的返回值为 0,即使我知道有错误的值,我还是把它们放在那里!但是,如果我尝试简单地通过抑制上面查询中的“NOT”子句来计算相反的情况(域中有多少行与我想要的相反,即有多少行不是)...好吧,那就是作品! ??

是的,肯定有很多解决方法,但我想知道为什么它不能按应有的方式工作。此外,我不能简单地更改整个查询,因为它的大部分是在 C# 代码内构建的,基本上我可以自由更改且不会对软件的任何其他部分产生影响的唯一部分是 select 语句:对应于域(无论出现在 NOT IN 子句中)。我希望我说清楚了,有人可以帮助我。

提前致谢。

最佳答案

对于 NOT IN,如果子查询返回 NULL 值,则始终为 false。接受的答案 this question优雅地描述了原因。

列值的 NULL 性也与所使用的数据类型无关:很可能您的 varchar 列具有 NULL 值

处理这个问题,使用 NOT EXISTS。对于非空值,它的工作方式与 NOT IN 相同,因此兼容

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField)

关于sql - COUNT() 函数与 NOT IN 子句结合使用 varchar 字段无法正常工作 (T-SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337438/

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