在SQL Server中是否有与ISNULL相反的功能?要做的不是空吗?

时间:2013-10-08 08:32:00

标签: sql sql-server isnull

我在select语句中有这段代码

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

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

干杯球员

8 个答案:

答案 0 :(得分:32)

您必须使用CASE

SELECT CASE WHEN Field IS NOT NULL
    THEN 'something'
    ELSE 'something else'
END

答案 1 :(得分:3)

有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',

答案 2 :(得分:1)

试试这个:

SELECT
  CASE
    WHEN a.PolicySignedDateTime IS NOT NULL THEN a.PolicySignedDateTime
    ELSE aq.Amount
FROM your joined table

但是,.... ISNULL(a.PolicySignedDateTime,aq.Amount)检查你的字段是否为null,所以不是null你得到它的值。

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

答案 3 :(得分:1)

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

SELECT(1-ISNULL(field));

如果NOT NULL,则为1;如果NULL,则为0 而不是1代表NULL,0代表NOT NULL

答案 4 :(得分:0)

没有相反的功能,但你可以在没有CASE的情况下完成。

如果string为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没有值。

答案 5 :(得分:0)

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

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

答案 6 :(得分: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'

答案 7 :(得分:0)

我知道已经晚了,但以防万一其他人查看并使用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