【问题标题】:SQL Conditional Select: Select nulls OR select non-nullsSQL 条件选择:选择空值或选择非空值
【发布时间】:2012-05-04 07:36:35
【问题描述】:

原问题:

我是 SQL Server 的新手,找不到我要找的东西。我正在尝试在 SQL 中创建此逻辑:

IF [column] IS NULL THEN
    ( SELECT [value] as [columnname] )
ELSE
    ( SELECT [column] WHERE [column_value] IS NOT NULL )

基本上,如果整列为空,我想选择并用某个值填充整列。

否则,如果该列不完全为空,我只想选择它的非空值(合并?)。

使用 SQL Server 2005 执行此操作的最佳方法是什么?

回答(感谢 Josh 和其他所有人!)

IF EXISTS(SELECT myColumn
          FROM mytable
          WHERE myColumn IS NOT NULL)
    SELECT myColumn as colName
    FROM myTable
    WHERE myColumn is NOT NULL
ELSE
    SELECT [nullReplacementValue] as colName
    FROM myTable

之前对困惑的澄清:

编辑:例如,如果给我一个输入表:

ColA    ColB    ColC
--------------------
A       null    null
B       null    1
C       null    null

如果我在 ColB 上运行此 SELECT,它应该返回:

ColB
----
null
null
null

(最终我想用某个值替换“null”,但这可能会在以后出现)。

如果我在 ColC 上运行此 SELECT,它应该返回:

ColC
----
1

【问题讨论】:

  • SQL Server : check if variable is NULL for WHERE clause 的重复以及关于 SO 的数十个类似问题 - 在再次提出相同问题之前,您应该 SEARCH FIRST...
  • 我一直在搜索一堆(我的第一行被截断,因为我以“hi all”或类似的开头)。我没有意识到它会在 WHERE 子句中。对不起/谢谢。
  • 我不相信那个帖子能完全回答我的问题,或者至少我不明白它是怎么做的。如果可选输入变量是否为空,则该帖子选择不同的值,而我试图查看现有的整个列是否为空,然后选择自身或自身的一部分。
  • “现有的整个列是否为空”是什么意思?一行中的字段可以为空。但是您是要检查所有已将该字段设置为 null 的行,还是逐行检查?
  • 我已经用答案更新了我的原始帖子。非常感谢,大家!还有@marc_s:对不起,我可能造成的head>>书桌。

标签: sql sql-server-2005 select null


【解决方案1】:

您首先需要了解 SQL 中的四个基本命令。我们将以下面的person表为例

姓名      已婚     家属
--------      ----------     ----------------
比尔           真        真
简        错误
弗兰        真         真
Ed           错误
汤姆        错误        正确


Select - (看起来您已经理解了)允许您根据搜索条件从一个或多个表中检索数据。

选择名称 从人 其中名称 = 'Bill'

此语句将返回以下内容

姓名      已婚     家属
-------      ----------     ----------------
比尔          真        真


插入 - 允许您将新记录输入到数据库中

插入人 (姓名、已婚、受抚养人) 价值观 ('吉尔','真','假')

这个语句会使 person 表看起来像下面的表

姓名      已婚     家属
--------      ----------     ----------------
比尔           真        真
简        错误
弗兰        真         真
Ed           错误
吉尔            是的
汤姆        错误        正确


删除 - 从表中删除记录

从名称 = 'Fran' 的人中删除

此语句将使 Person 表如下所示

姓名      已婚     家属
--------      ----------     ----------------
比尔           真        真
简        错误
Ed           错误
吉尔            是的
汤姆        错误        正确


终于找到了你要找的那个
***更新 - 允许您根据您的标准为任意数量的记录更新表

直到今天,如果某人没有受抚养人,您将“受抚养人”列保留为空。现在你的老板告诉你,没有家属的人必须在家属栏中填写“False”。你会写下面的语句

更新人 SET 家属 = '假' WHERE 家属 = NULL

您的表格如下所示

姓名      已婚     家属
-------      ----------     ----------------
比尔           真          真
简        错误 错误
编           错误         错误
吉尔            真          假
汤姆        错误          正确

【讨论】:

  • 感谢您的回复!这是一个很好的概述,尽管对于这个查询,我不想修改表,只是为了选择某些值。
【解决方案2】:

如果您只是询问一种在已知列中默认值的方法,如果该列中的所有值都是 NULL,那么您可以使用这个:

IF EXISTS(SELECT myColumn FROM mytable WHERE myColumn IS NOT NULL)
    SELECT myColumn FROM myTable WHERE myColumn is NOT NULL
ELSE
    UPDATE myTable SET myColumn = myValue

这是检查您关心的列中是否至少有一个值不为空。如果是,则表示您要选择。否则,您将更新所有列,因为您在请求不为空的列时没有返回结果。

【讨论】:

  • 非常感谢,这成功了!我修改了它,因为我正在寻找更接近以下内容的内容: IF EXISTS(SELECT myColumn FROM mytable WHERE myColumn IS NOT NULL) SELECT myColumn as colName FROM myTable WHERE myColumn is NOT NULL ELSE SELECT [nullReplacementValue] as colName FROM myTable 很多重复代码,我的实际实现要长得多,但它完成了工作!非常感谢,我很抱歉所有的headbanging 和 facepalms 没有从正确的搜索中找到这个。 :/ 编辑:哦,亲爱的,这里的格式都搞砸了。我将在我的 OP 中发布
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2020-08-07
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多