Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并语句:Don';t更新空白字段_Sql_Sql Server_Sql Server 2008_Merge_Case - Fatal编程技术网

Sql 合并语句:Don';t更新空白字段

Sql 合并语句:Don';t更新空白字段,sql,sql-server,sql-server-2008,merge,case,Sql,Sql Server,Sql Server 2008,Merge,Case,我正在执行一个从临时表t到主表ts的MERGE语句,在一个ID字段上进行匹配。它包含以下内容: WHEN MATCHED THEN UPDATE SET ts.username = t.username, ts.password = t.password, ts.title = t.title, ts.firstname = t.firstname, ts.surname = t.surname, ts.email = t.email 如果临时表t中的用户名和密码为空,我不想更新主表ts

我正在执行一个从临时表
t
到主表
ts
的MERGE语句,在一个ID字段上进行匹配。它包含以下内容:

WHEN MATCHED THEN UPDATE
   SET ts.username = t.username, ts.password = t.password, ts.title = t.title, ts.firstname = t.firstname, ts.surname = t.surname, ts.email = t.email
如果临时表
t
中的用户名和密码为空,我不想更新主表
ts
。我该怎么做

编辑:看起来像是一个
CASE
语句,或者使用
合并(NULLIF(t.username.),ts.username)
将起作用。哪一种最好?

在处理空格(即空字符串)时,然后使用case语句

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' then ts.username else t.username end
WHEN MATCHED THEN UPDATE
   SET case when t.username = '' or t.username is null then ts.username else t.username end
如果您处理的是null,那么使用isnull

WHEN MATCHED THEN UPDATE
   SET ts.username = isnull(t.username, ts.username),
如果可以为空或null,则可以在case语句中处理这两个问题

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' then ts.username else t.username end
WHEN MATCHED THEN UPDATE
   SET case when t.username = '' or t.username is null then ts.username else t.username end
在处理空格(即空字符串)时,使用case语句

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' then ts.username else t.username end
WHEN MATCHED THEN UPDATE
   SET case when t.username = '' or t.username is null then ts.username else t.username end
如果您处理的是null,那么使用isnull

WHEN MATCHED THEN UPDATE
   SET ts.username = isnull(t.username, ts.username),
如果可以为空或null,则可以在case语句中处理这两个问题

WHEN MATCHED THEN UPDATE
   SET case when t.username = '' then ts.username else t.username end
WHEN MATCHED THEN UPDATE
   SET case when t.username = '' or t.username is null then ts.username else t.username end

您可以进行虚拟更新吗?例如,设置ts.username=coalesce(t.username,ts.username),…@Frank Schmitt我从来不知道coalesce函数。如果我把它和NULLIF一起使用,如果我认为这样就可以了!实际问题是:是否要从更新中删除记录,因为即使将其设置为以前的值,记录也会始终更新。只是不想用空白值覆盖现有用户名/密码。感谢Frank Schmitt和Chris GesslerIs,你现在可以进行虚拟更新了吗?例如,设置ts.username=coalesce(t.username,ts.username),…@Frank Schmitt我从来不知道coalesce函数。如果我把它和NULLIF一起使用,如果我认为这样就可以了!实际问题是:是否要从更新中删除记录,因为即使将其设置为以前的值,记录也会始终更新。只是不想用空白值覆盖现有用户名/密码。感谢Frank Schmitt和Chris Gesslertanks Chris,这一点现在已经解决了,但是我决定使用
ISNULL(NULLIF(t.username.),ts.username)
,因为它比case语句更紧凑。感谢Chris,这一点很有效,但是我决定使用
ISNULL(NULLIF(t.username.),ts.username)
相反,因为它比case语句更紧凑。