SQL Server - 如果两个特定字段都为空,则从视图中排除记录
Posted
技术标签:
【中文标题】SQL Server - 如果两个特定字段都为空,则从视图中排除记录【英文标题】:SQL Server - Excluding records from a view if two certain fields are both null 【发布时间】:2011-03-25 11:37:55 【问题描述】:我正在 SQL Server 中编写一个视图,我需要过滤结果,以便如果记录上的两个特定字段具有空值,则排除该记录。
例如,表Customer
具有字段Code, Name, Address, Payment, Payment_Date
。
如果Payment
和Payment_Date
都为空,则从结果集中排除该记录,但如果只有一个为空(或任何其他字段),则返回记录即可。
这个功能在 SQL Server 中可以实现吗?任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:SELECT *
FROM mytable
WHERE other_conditions
…
AND (payment IS NOT NULL OR payment_date IS NOT NULL)
【讨论】:
【参考方案2】:合并两个字段,并检查该值是否为空
select * from yourtable where coalesce(field1, field2, field3, etc, etc,) is not null
这比一串 OR 子句更容易理解(恕我直言)
【讨论】:
@Lasse - 不。表达式也需要兼容的数据类型。如果Payment
是十进制且Payment_Date
日期,则不会出现这种情况。 (但如果是浮点数和日期时间!)
@Lasse:不,但是索引不太可能用于过滤这个。
@Martin - 关于兼容数据类型的非常好的观点 - 在我再次查看之前没有在 OP 中看到该要求。至于coalesce
是否可搜索,如果编译器没有将coalesce
扩展为case
或类似的东西,我会感到惊讶,但即使这样做,我怀疑@quassnoi 是正确的索引不太可能被选中。
@Ralph - 它确实扩展为 CASE
,但 CASE
不可分割。【参考方案3】:
您可以在 where 子句中执行此操作,只需将其翻转并使用 OR 代替:
WHERE
(
PAYMENT IS NOT NULL
OR
PAYMENT_DATE IS NOT NULL
)
AND
-- ...rest of where clause here...
【讨论】:
以上是关于SQL Server - 如果两个特定字段都为空,则从视图中排除记录的主要内容,如果未能解决你的问题,请参考以下文章
带有架构的 pyspark.sql SparkSession load() :架构中的非字符串类型字段使所有值都为空
sql server 2008环境中,字段为decimal(18,2),当输入为空时,会报错。