免责声明:我仍然在学习SQL,所以如果我的问题是业余的,或者是一个非常简单的答案,我很抱歉。我没有受过正规的训练。我在自学。谢谢。
如果电子邮件列为空,则创建一个特定的查询,以便使用EMAIL2列中的数据更新电子邮件列。该查询继续从EMAIL 3-6列获取数据,如果前面的列也是空的,则尝试填充电子邮件列。它目前的情况如下:
update Parents set email = email2 where email = ' ' OR email is null go
update Parents set email = email3 where email = ' ' OR email is null go
update Parents set email = email6 where email = ' ' OR email is null go
(等等)
有没有一种更简单的方法,使用某种IF...THEN类型的条件来检查电子邮件列中的空白或null,并根据次要列中的数据填充它呢?还需要检查这些列的空值或空值,如果空值或空值为true,则跳过。
我很感激你能给我的任何建议。上面的查询起作用了,只是觉得这不是最好的方法。
发布于 2013-01-08 16:06:53
NULLIF是您想要使用的一个方便的函数。它允许您在可能希望将值视为NULL的情况下简化您的逻辑。例如,如果应用程序在NULLable列column1中放置'NA‘的哨兵值,NULLIF(column1, 'NA')将返回所有NULL和所有NAs的空值。在您的示例中,我们将使用此技巧将空字符串转换为NULL。
我们要做的另一件事是减少所有空字符串,这样我们的NULLIF只需要检查“”(而不是“”、“和”的场景)。TSQL只提供LTRIM和RTRIM,我有使用RTRIM的习惯,尽管从任何方向修剪空字符串都会导致我们想要的状态。NULLIF(RTRIM(column1),'')
使用该表达式,我们现在可以正确地插入聚结函数。因此
UPDATE
P
SET
email = COALESCE(NULLIF(RTRIM(P.email2), ''), NULLIF(RTRIM(P.email3), ''), NULLIF(RTRIM(P.email4), ''))
FROM
dbo.Parents P
WHERE
-- This will force a table scan which can be a bad thing for performance
-- Generally, one should avoid wrapping functions around a column and instead
-- apply them to the thing being tested
NULLIF(RTRIM(P.email), '') IS NULL发布于 2013-01-08 15:48:24
你是说像这样的事吗?
update Parents
set email = COALESCE(
NULLIF(LTRIM(RTRIM(email2), '')),
NULLIF(LTRIM(RTRIM(email3), '')),
NULLIF(LTRIM(RTRIM(email4), '')),
NULLIF(LTRIM(RTRIM(email5), '')),
NULLIF(LTRIM(RTRIM(email6), ''))
)
where email = ' ' OR email is null这个
LTRIM(RTRIM(email2)将确保将“”转换为“空字符串”,因为Server没有trim,而是两个独立的函数LTRIM和RTRIM。如果两个表达式相等,NULLIF返回null。因此,如果任何电子邮件科尔为空或公正‘,它将返回空。
COALESCE函数将返回第一个表达式的值,即不是null。
发布于 2013-01-08 17:00:57
这并不是为了使这篇文章成为关于COALESCE和NULLIF的教程,而是为了证明他在回答中提供的所有@billinkc,这就是为什么这起作用。(对不起,他回答的时候,我正在研究这个解决方案)。将其插入SSMS并查看结果。不过,上面所示的简单更新会做得很好。
刚刚发现SQL资源:SQL Fiddle
--Setup the temp table
DECLARE @Parents TABLE (
ParentsId INT IDENTITY (1,1) PRIMARY KEY,
email varchar(max),
email2 varchar(max),
email3 varchar(max),
email4 varchar(max),
email5 varchar(max),
email6 varchar(max)
)
--This would be the pull from your real Parents Table.
INSERT INTO @Parents
SELECT
NULL,'test@domain.com',' ',NULL,NULL,NULL
UNION ALL
SELECT
NULL,' ',NULL,NULL,NULL,'test2@domain.com'
UNION ALL
SELECT
NULL,'',NULL,NULL,NULL,'test3@domain.com'
--Look at the data before we cleanse it
SELECT * FROM @Parents
--Take a look at what COALESCE looks like before the cleanse
SELECT ParentsId, COALESCE(email2,email3,email4,email5,email6) AS NewEmail FROM @Parents
--RUN the NULLIF
UPDATE @Parents SET
email2 = NULLIF(email2,' '),
email3 = NULLIF(email3,' '),
email4 = NULLIF(email4,' '),
email5 = NULLIF(email5,' '),
email6 = NULLIF(email6,' ')
SELECT * FROM @Parents
--Take a look at what COALESCE looks like after the cleanse
SELECT ParentsId, COALESCE(email2,email3,email4,email5,email6) AS NewEmail FROM @Parentshttps://stackoverflow.com/questions/14218715
复制相似问题