首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行更新的to中的IF....THEN语句

执行更新的to中的IF....THEN语句
EN

Stack Overflow用户
提问于 2013-01-08 15:44:23
回答 3查看 671关注 0票数 3

免责声明:我仍然在学习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,则跳过。

我很感激你能给我的任何建议。上面的查询起作用了,只是觉得这不是最好的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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),'')

使用该表达式,我们现在可以正确地插入聚结函数。因此

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-01-08 15:48:24

你是说像这样的事吗?

代码语言:javascript
复制
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

这个

代码语言:javascript
复制
LTRIM(RTRIM(email2)

将确保将“”转换为“空字符串”,因为Server没有trim,而是两个独立的函数LTRIMRTRIM。如果两个表达式相等,NULLIF返回null。因此,如果任何电子邮件科尔为空或公正‘,它将返回空。

COALESCE函数将返回第一个表达式的值,即不是null

票数 3
EN

Stack Overflow用户

发布于 2013-01-08 17:00:57

这并不是为了使这篇文章成为关于COALESCE和NULLIF的教程,而是为了证明他在回答中提供的所有@billinkc,这就是为什么这起作用。(对不起,他回答的时候,我正在研究这个解决方案)。将其插入SSMS并查看结果。不过,上面所示的简单更新会做得很好。

刚刚发现SQL资源:SQL Fiddle

代码语言:javascript
复制
--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 @Parents
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14218715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档