SQL Server-仅过滤列等于值的记录

时间:2018-12-18 12:53:21

标签: sql-server tsql

假设我有以下(虚构的)数据集

@FunctionalInterface

对于我的数据集,我想删除所有 ID | Name | Location | LastUpdated 1 | Bill | Germany | 2017-01-02 2 | Bill | Germany | 2017-01-03 3 | Bill | Germany | 2017-01-04 4 | Bill | Germany | 2017-01-05 5 | Jack | U.K | 2017-01-02 6 | Jack | U.K | 2017-01-03 7 | Jack | U.K | 2017-01-04 8 | John | Japan | 2017-02-22 9 | John | Japan | 2017-02-23 10 | John | Japan | 2017-02-24 11 | John | Japan | 2017-02-25 等于lastupdated的记录

我还想删除2017-01-03等于或大于John的所有lastupdated记录

我尝试了以下SQL语句:

2017-02-24

但是这样,它只返回LastUpdated大于SELECT * FROM Table WHERE (LastUpdated <> '2017-01-03') AND (Name <> 'John' AND LastUpdated >= '2017-02-24')

的记录。

这看起来很基础,但我无法解决。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以这样记录您的要求:

  

我要删除lastupdated等于2017-01-03的所有记录

根据您的尝试,这是正确的:

LastUpdated <> '2017-01-03'
  

我还想删除lastupdated等于或等于John的所有记录   大于2017-02-24

这有点棘手。我们要显示的记录不是John的 记录是John的 AND 的日期必须小于2017- 02-24 。表示如下:

 (
    Name <> 'John' OR
    (Name = 'John' AND LastUpdated < '2017-02-24')
 )

所以最终的表达式是:

SELECT *
FROM [Table]
WHERE 
    LastUpdated <> '2017-01-03' AND
     (
        Name <> 'John' OR
        (Name = 'John' AND LastUpdated < '2017-02-24')
     )

如果name可以容纳NULL个值,则可能需要另一个OR表达式来检查NULL

 (
    Name <> 'John' OR
    Name IS NULL OR
    (Name = 'John' AND LastUpdated < '2017-02-24')
 )

答案 1 :(得分:1)

您可以将其写为NOT条件以使其简单:

WHERE NOT (
    (lastupdated = 2017-01-03)
    OR
    (name = 'John' AND lastupdated >= '2017-02-24')
)