48

我的选择语句中有这段代码

ISNULL(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',

但我想看看“a.PolicySignedDateTime”是否不为空。是否有一个不涉及使用“if”语句的简单功能?

干杯伙计们

4

8 回答 8

45

你必须使用CASE

SELECT CASE WHEN Field IS NOT NULL
    THEN 'something'
    ELSE 'something else'
END
于 2013-10-08T08:34:32.523 回答
10

我知道已经晚了,但以防万一其他人查看此内容并使用 MSSQL 2012 或更高版本,您可以使用“IIF”语句。

我猜 OP 不想使用 'IF' 分句,原因是“太多的代码语法”来完成简单的东西。

比“IF”语句更简洁的替代方法是“IIF”。只是一个内联的“IF”简化。

SELECT IIF(X IS NULL, 'Is null', 'Not null') 'Column Name'

关于OP

SELECT IIF(a.PolicySignedDateTime IS NULL, NULL, aq.Amount) AS 'Signed Premium'

https://docs.microsoft.com/en-us/sql/t-sql/functions/logical-functions-iif-transact-sql?view=sql-server-ver15

于 2019-12-17T13:41:00.570 回答
3

在我看来,这将是一种相反的简单方法。

选择(1-ISNULL(字段));

如果 NOT NULL 会给你 1,如果 NULL 给你 0 而不是 NULL 的 1 和 NOT NULL 的 0

于 2020-01-10T23:10:00.863 回答
2

有 COALESCE 表达式(虽然不是函数https://msdn.microsoft.com/en-us/library/ms190349.aspx)按顺序测试参数并继续执行,直到发现值不为 NULL 并返回它。

示例用法:
SELECT COALESCE(NULL, NULL, 5)--returns 5

在您的情况下:
COALESCE(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',

于 2016-11-09T09:33:44.790 回答
1

试试这个:

选择
  案子
    当 a.PolicySignedDateTime 不为空时,a.PolicySignedDateTime
    ELSE aq.Amount
从您的连接表

但是.... ISNULL(a.PolicySignedDateTime, aq.Amount) 检查您的字段是否为空,因此您获取其值是否为空。

所以我不太明白,因为你想用另一种方式。

于 2013-10-08T08:36:26.693 回答
0

没有相反的功能,但您可以在没有CASE.

如果字符串为 NULL,则使用字符串 + 'something' 将为 NULL 的事实,如果为 null,则使用 ISNULL 返回 'somethingelse',使用 RIGHT() 获取返回值的结尾,并使用NULLIF,然后使用 COALESCE 来做你想做的事情,如果那是 NULL (意味着原始值不为空)。

例子:

declare @text varchar(20) = 'some text or value'

select COALESCE(NULLIF(RIGHT(ISNULL(@text + 'NOT', 'IS ') + 'NULL', 7), 'NOTNULL'), 'NOT NULL')

试试这段代码,也试试@text 没有价值。

于 2018-05-09T12:10:00.790 回答
0

由于我们处于 DBMS 环境中,因此可以使用基于集合的方法。因此,假设表有一个标识符字段 (id) - 主键或唯一且不为空,则可以通过以下方式完成工作:

SELECT numeric_field * count(flag_field) AS not_null_flag_numeric_value_or_zero
FROM my_table
GROUP BY id, numeric_field 

如果 value 字段是字符数据类型,则应使用一些 char 函数。因此,该方法的实际实现可能如下:

SELECT * INTO #temporary_table 
FROM 
  (VALUES 
    (1, 1, 111, 'string_1'),
    (2, NULL, 222, 'string_2')
  ) data_table(id, flag_field, numeric_field, character_field)

ALTER TABLE #temporary_table ADD CONSTRAINT tab_pk PRIMARY KEY (id)

SELECT 
  count(flag_field) AS is_not_null,
  numeric_field * count(flag_field) AS numeric_value_or_zero,
  numeric_field * nullif(count(flag_field), 0) AS numeric_value_or_null,
  left(character_field, len(character_field) * count(flag_field)) AS character_value_or_empty,
  stuff(character_field, nullif(count(flag_field), 0), 0, '') AS character_value_or_null
FROM #temporary_table
GROUP BY id, numeric_field, character_field

--DROP TABLE #temporary_table

以 1 的形式获取 NOT NULL 符号的另一个选项是使用 flag_field 值到位的转换:

... cast(flag_field as bit) ...

这在您的 flag_field 数据类型可以转换为位时有效,并且当您可以将 0 值和 NULL 视为相同的 NO VALUE 时很有用。由 NULL 或 0 表示 - 由您选择:

SELECT 
  nullif(cast(flag_field as bit), 0) AS is_not_null_or_null, 
  isnull(cast(flag_field as bit), 0) AS is_not_null_or_zero,
  numeric_field * nullif(cast(flag_field as bit), 0) AS value_or_null, 
  numeric_field * isnull(cast(flag_field as bit), 0) AS value_or_zero
FROM #temporary_table
于 2018-08-16T14:53:10.403 回答
0
CREATE FUNCTION ISNUL (@DATA sql_variant) RETURNS BIT AS 
  BEGIN
  IF (@DATA IS NULL) RETURN 1;
  RETURN 0
END

SELECT dbo.ISNUL(NULL) -- 1
SELECT dbo.ISNUL('123') -- 0
SELECT dbo.ISNUL(123) -- 0
SELECT dbo.ISNUL(123) ^ dbo.ISNUL(NULL), dbo.ISNUL('123') ^ dbo.ISNUL(NULL), dbo.ISNUL('123') ^ dbo.ISNUL(123), dbo.ISNUL(NULL) ^ dbo.ISNUL(NULL)  -- 1,1,0,0

或者当 XOR 成为焦点时:

CREATE FUNCTION XOR (@D1 sql_variant, @D2 sql_variant) RETURNS BIT AS 
BEGIN
  IF (@D1 IS NULL AND @D2 IS NULL) RETURN 0;
  IF (@D1 IS NOT NULL AND @D2 IS NOT NULL) RETURN 0;
  RETURN 1
END

SELECT XOR(NULL,123), XOR('123',NULL), XOR(NULL,NULL), XOR('123',123)
SELECT 'TRUE' where XOR(NULL,123) = 'true'
SELECT 'FALSE' where XOR('123',123) = 'false'
于 2018-11-26T10:39:48.427 回答