Sql server SQL Server-仅当记录的日期为空时才排除值的查询

Sql server SQL Server-仅当记录的日期为空时才排除值的查询,sql-server,Sql Server,我有一张这样的桌子。我正在使用SQLServerAzure。我试图返回所有不是红色且没有绘制日期的颜色-日期为空 CREATE TABLE [dbo].[COLORS] ( [ID] [INT] IDENTITY(1,1) NOT NULL, [COLOR] [VARCHAR](10) NULL, [DATE_PAINTED] [SMALLDATETIME] NULL, CONSTRAINT [PK_COLORS] PRIMARY KEY CL

我有一张这样的桌子。我正在使用SQLServerAzure。我试图返回所有不是红色且没有绘制日期的颜色-日期为空

CREATE TABLE [dbo].[COLORS]
(
    [ID] [INT] IDENTITY(1,1) NOT NULL,
    [COLOR] [VARCHAR](10) NULL,
    [DATE_PAINTED] [SMALLDATETIME] NULL,

    CONSTRAINT [PK_COLORS] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[COLORS] ON 

INSERT [dbo].[COLORS] ([ID], [COLOR], [DATE_PAINTED]) 
VALUES (1, N'RED', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (2, N'BLUE', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (3, N'GREEN', NULL),
       (4, N'PURPLE', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (5, N'BLACK', NULL),
       (6, N'WHITE', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (7, N'ORANGE', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (8, N'YELLOW', CAST(N'2000-01-01T00:00:00' AS SmallDateTime)),
       (9, N'RED', NULL)

SET IDENTITY_INSERT [dbo].[COLORS] OFF
查询应返回除
红色
日期(空

显然,这是行不通的:

SELECT * 
FROM COLORS
WHERE COLOR <> 'RED' AND DATE_PAINTED IS NOT NULL
选择*
从颜色
其中颜色“红色”和绘制日期不为空
正确/最佳的查询是什么。表中还有25000多条记录。

这是您想要的吗

SELECT *
FROM COLORS
WHERE NOT (COLOR = 'RED' AND DATE_PAINTED IS NULL);
没有
NOT
的等效逻辑(假设
COLOR
从不
NULL
)为:

SELECT *
FROM COLORS
WHERE COLOR <> 'RED' OR DATE_PAINTED IS NOT NULL;
选择*
从颜色
颜色“红色”或涂日期不为空;

您可以使用以下查询

SELECT *
FROM [dbo].[COLORS]
WHERE COLOR <> 'RED' OR DATE_PAINTED IS NOT NULL;
选择*
来自[dbo]。[颜色]
颜色“红色”或涂日期不为空;

这取决于您想要的是除ID为1的行以外的所有内容,还是除第9行以外的所有内容,或者是我没有从您的问题中解释的内容

除了ID为1的行之外的所有内容-其中红色和涂日期不为空

SELECT * FROM dbo.COLORS
WHERE (COLOR<>'RED') OR (DATE_PAINTED IS NULL);
从dbo.COLORS中选择*
其中(红色)或(涂色日期为空);
除了第9行的颜色是红色,日期是空的,这和@Gordon Linoff建议的一样

SELECT * FROM dbo.COLORS
WHERE (COLOR<>'RED') OR (DATE_PAINTED IS NOT NULL);
从dbo.COLORS中选择*
其中(颜色为“红色”)或(涂色日期不为空);

请向我们展示您期望的结果。查询显然不起作用是什么意思?