查询基于一个字段从表中获取记录,并检查字段是否为-1

时间:2014-09-29 05:41:19

标签: sql sql-server tsql

我有一个名为文档的表,其中包含字段 Document_ID (主键)和 Cluster_ID ,现在我想要所有的Document_ID相同的Cluster_ID,基于Document_ID(作为参数传递),Cluster_ID的默认值为' -1'。

例如: dbo.Documents

 Document ID ********   Cluster_ID

 - 1******************          -1
 - 2******************             1001
 - 3******************             1001
 - 4******************             -1
 - 5******************             1002
 - 6******************             1001
 - 7******************              -1
 - 8******************              -1
 - 9******************              -1

现在, 如果Document_ID是2,那么我想将结果作为Document_ID = 2,3,6的行,这里我无法处理具有cluster_ID = -1的记录;(因为-1 id是表的默认值,并且有数百个匹配的记录在表中)

我尝试了下面提到的查询工作正常,但是当我执行Document_ID = 7的查询时,它将返回5行,其中cluster_ID = -1,

SELECT d2.* 
FROM dbo.Documents d1 
join dbo.Documents d2 on d1.Cluster_ID=d2.Cluster_ID 
WHERE d1.Document_ID =2

我的问题是: 它返回表中具有Cluster_ID = -1的所有行,我想要的是,如果Cluster_ID = -1,则返回单行else返回具有相同cluster_ID的所有行

4 个答案:

答案 0 :(得分:1)

尝试此查询

SELECT
    Document_ID,
    Cluster_ID
FROM Documents
WHERE Cluster_ID =
(
    SELECT
        Cluster_ID
    FROM Documents
    WHERE Document_ID = @Document_ID
)
AND Cluster_ID <> -1

UNION

SELECT
    Document_ID,
    Cluster_ID
FROM Documents
WHERE Document_ID = @Document_ID 
AND Cluster_ID = -1

答案 1 :(得分:0)

请试试这个。 这里 @doumentId 是您需要传递的参数。

DECLARE @Cluster_ID int
 SET Cluster_ID = (
    SELECT Cluster_ID
    FROM
    FROM Documents
    WHERE Document_ID = @documentId
    )

IF Cluster_ID > 0
BEGIN
 SELECT *
 FROM Documents
 WHERE Cluster_ID = (
        SELECT Cluster_ID
        FROM Documents
        WHERE Document_ID = @documentId
        )
END
ELSE
BEGIN
    SELECT *
    FROM
    FROM Documents
    WHERE Document_ID = @documentId
END

答案 2 :(得分:0)

您需要两个与UNION ALL结合的查询。如果Cluster_ID不等于-1,则第一个为您提供所有需要的记录。第二个为您提供了Cluster_ID等于-1的情况的一条记录。所以你得到第一部分的记录或第二部分的记录。

select Document_ID, Cluster_ID
from dbo.Documents
where Cluster_ID in
(
  select nullif(Cluster_ID, -1)
  from dbo.Documents
  where Document_ID = @Document_ID 
)
UNION ALL
select Document_ID, Cluster_ID
from dbo.Documents
where Document_ID = @Document_ID and Cluster_ID = -1

答案 3 :(得分:0)

您可以尝试此IF \ Else查询

DECLARE @Cluster_ID int;
SELECT @Cluster_ID=Cluster_ID FROM Documents WHERE Document_ID=@Document_ID;
IF @Cluster_ID=-1
BEGIN
SELECT Document_ID,Cluster_ID FROM Documents WHERE Document_ID=@Document_ID;
END
ELSE
BEGIN
SELECT Document_ID,Cluster_ID FROM Documents WHERE Cluster_ID=@Cluster_ID;
END

此查询将采用clusterid,然后根据它是否为-1返回单行或所有行