【发布时间】:2020-11-26 07:13:20
【问题描述】:
我有一个数据库列,其值以编程方式确定,不受用户输入的影响。该值绝不是空字符串;它是 NULL 或非 0 长度字符串。该列当前可以为空。
通常,我想在两个不同的行之间比较该列。因为该列可以为空,所以我必须执行以下操作:
SELECT *
FROM
myTable A
INNER JOIN myTable B ON ISNULL(B.someColumn, '') = ISNULL(A.someColumn, '')
WHERE B.Id > A.Id
如果空字符串没有意义,我是否会更明智地将列设为NOT NULL 并使用空字符串表示该列没有值?
然后我可以使用以下方法比较列:
SELECT *
FROM
foo A
INNER JOIN foo B ON B.someColumn = A.someColumn
WHERE B.Id > A.Id
我似乎这种方法可以更好地利用列 someColumn 上的索引?
是的,我知道我可以做到:
(B.someColumn = A.someColumn) or (B.someColumn is NULL and A.someColumn is NULL)
但这似乎有点罗嗦。
【问题讨论】:
-
我正在将表连接到自身,如 SQL 示例和说明中所述。有问题的列不是主键,但出于报告目的,找到与该列具有相同值的行很重要。
-
看看 ansi null docs.microsoft.com/en-us/sql/t-sql/statements/…
-
@WalterVehoeven 但这在数据库范围内正确吗?我无法进行范围如此广泛的更改。不过谢谢你的建议。但它引出了一个问题,为什么默认情况下不关闭 ANSI NULL?另请注意,我们确实有索引视图。
-
我会倾向于让它成为
NOT NULL DEFAULT '',但这可能会影响整个应用程序。琐事:Oracle 数据库不做零长度字符串(好吧:没有,我有一段时间没用过 Oracle) -''被翻译成NULL。酷吧?所以你会被你正在做的事情困住。 -
@GregHNZ 我创建了该列并编写了处理该列的所有代码,因此我确信将其默认为空字符串(而不是 NULL)是安全且面向未来的。
标签: sql sql-server-2016