Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 排除CTE查询中的空行_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 排除CTE查询中的空行

Sql 排除CTE查询中的空行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我不熟悉在SQL Server中使用CTE查询。在web的帮助下,我构建了这个查询,以便开始构建更改日志,突出显示数据库中所做的更改。请参阅下面链接的示例。我想排除没有更改的行。你能帮助完成这项工作吗 11月7日changedate的第3行具有空值。我希望此行不显示。我也不想做像whererow1、row2和row3这样的事情,因为我的最终查询将包含更多的行。这可能吗 这里有一个您可以使用的选项。 下面使用合并函数 使用相同的数据,只是修改了SQLFIDLE中的代码。 CASE语句在匹配时返回N

我不熟悉在SQL Server中使用CTE查询。在web的帮助下,我构建了这个查询,以便开始构建更改日志,突出显示数据库中所做的更改。请参阅下面链接的示例。我想排除没有更改的行。你能帮助完成这项工作吗

11月7日changedate的第3行具有空值。我希望此行不显示。我也不想做像whererow1、row2和row3这样的事情,因为我的最终查询将包含更多的行。这可能吗


这里有一个您可以使用的选项。 下面使用合并函数

使用相同的数据,只是修改了SQLFIDLE中的代码。 CASE语句在匹配时返回NULL,并将数据类型强制转换为varchar,然后在where中使用COALESCE

下面修改了脚本以包含nTEXT列。您可以在WHERE子句中将DATALENGTH与COALESCE一起使用

修改:


与SQL Server 2012稍有不同的方法是在公共表表达式中使用LAG,以便能够检测逐行更改。CTE基本上从前一行中提取每一行以及相关数据,并在外部查询中进行直接比较以生成结果

WITH cte AS (
  SELECT 
    empid, changeDate,
    LAG(name)   OVER (PARTITION BY empid ORDER BY changeDate) oldname,   name,
    LAG(salary) OVER (PARTITION BY empid ORDER BY changeDate) oldsalary, salary,
    LAG(room)   OVER (PARTITION BY empid ORDER BY changeDate) oldroom,   room
  FROM tblEmp
)
SELECT empid,
  CASE WHEN name<>oldname     THEN oldname   ELSE '' END oldname, 
  CASE WHEN name<>oldname     THEN name      ELSE '' END newname, 
  CASE WHEN salary<>oldsalary THEN oldsalary ELSE '' END oldsalary, 
  CASE WHEN salary<>oldsalary THEN salary    ELSE '' END newsalary, 
  CASE WHEN room<>oldroom     THEN oldroom   ELSE '' END oldroom, 
  CASE WHEN room<>oldroom     THEN room      ELSE '' END newroom,
  changeDate
FROM cte
WHERE oldname<>name OR oldsalary<>salary OR oldroom<>room
ORDER BY empid, changeDate;

.

您可以在查询结束时使用WHERE子句,根据列的不同,检查每个CASE语句是否为空。@TabAlleman谢谢,但这正是我试图避免的。没有其他方法吗?该查询返回一行修改后的空值。如果OP只想检查null,但他需要检查某些列中是否有空格,那么根据您的要求应该不为null。@TabAlleman。。正如我提到的,OP需要将CASE更改为返回NULL,而不是blank,以使用COALESCE函数。请检查我发布的修改后的代码。我刚刚发现一些列将采用NTEXT格式。有什么方法可以像其他的一样比较这些NTEXT字段吗?我刚刚发现有些列将采用NTEXT格式。有没有办法像其他字段一样比较这些NTEXT字段?
WITH cte AS (
  SELECT 
    empid, changeDate,
    LAG(name)   OVER (PARTITION BY empid ORDER BY changeDate) oldname,   name,
    LAG(salary) OVER (PARTITION BY empid ORDER BY changeDate) oldsalary, salary,
    LAG(room)   OVER (PARTITION BY empid ORDER BY changeDate) oldroom,   room
  FROM tblEmp
)
SELECT empid,
  CASE WHEN name<>oldname     THEN oldname   ELSE '' END oldname, 
  CASE WHEN name<>oldname     THEN name      ELSE '' END newname, 
  CASE WHEN salary<>oldsalary THEN oldsalary ELSE '' END oldsalary, 
  CASE WHEN salary<>oldsalary THEN salary    ELSE '' END newsalary, 
  CASE WHEN room<>oldroom     THEN oldroom   ELSE '' END oldroom, 
  CASE WHEN room<>oldroom     THEN room      ELSE '' END newroom,
  changeDate
FROM cte
WHERE oldname<>name OR oldsalary<>salary OR oldroom<>room
ORDER BY empid, changeDate;