我在select语句中有这段代码
ISNULL(a.PolicySignedDateTime,aq.Amount) AS 'Signed Premium',
但我想看看“a.PolicySignedDateTime”是否为空。 是否有一个简单的功能,不涉及使用“if”语句?
干杯球员
答案 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'