IF .... THEN语句在T-SQL中执行UPDATE

时间:2013-01-08 15:44:23

标签: sql-server tsql

  

免责声明:我仍然在学习SQL,所以如果我的问题以业余爱好者的形式出现或者是一个非常简单的答案,我会道歉。我没有正式的训练。我在教自己。感谢。

如果EMAIL列为空,则创建一个特定查询以使用EMAIL2列中的数据更新EMAIL列。此查询继续从EMAIL3-6列中获取数据,如果任何先前的列也是空白,以尝试填充EMAIL列。它目前如下:

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 ...然后在EMAIL列中键入条件以检查空白或空,并根据辅助列中的数据填充它?还需要检查这些列是否为空值或空值,如果为空或null为真,则跳过这些列。

我感谢任何可以给出的建议。上面的查询工作它只是感觉不是最好的方法去做。

3 个答案:

答案 0 :(得分:3)

你的意思是这样吗?

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)

将确保将''转换为空字符串'',因为SQL Server没有修剪,但有两个单独的函数LTRIMRTRIM。如果两个表达式相等,则NULLIF返回null。 因此,如果任何电子邮件cols为null或只是''它将返回null。

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

答案 1 :(得分:3)

你想要成为一个方便的功能是NULLIF。它允许您在可能希望将值视为NULL的情况下简化逻辑。例如,如果应用程序在一个NULLable列column1中放置了一个'NA'的标记值,NULLIF(column1, 'NA')将返回所有NULL和所有NA的NULL值。在你的情况下,我们使用这个技巧将空字符串转换为NULL。

我们要做的另一件事是修剪所有空字符串,这样我们的NULLIF只需要检查''(而不是'','','',ad nauseum)的场景。 TSQL只提供LTRIM和RTRIM,我习惯使用RTRIM,尽管从任一方向修剪一个空字符串将导致我们所需的状态。 NULLIF(RTRIM(column1),'')

使用该表达式,我们现在可以插入COALESCE函数。因此

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

答案 2 :(得分:1)

不要将它作为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 @Parents