查询中的每一行可能有不同的条件吗?

时间:2011-11-23 21:53:23

标签: sql postgresql

如何选择每行匹配不同条件的行集?

示例:

假设我有一个名为name的列的表,我想要结果只有第一行名称匹配'A',第二行名称匹配'B'而第三行名称匹配'C'。

修改

我想这样做是为了在没有固定大小的情况下工作,但在某种程度上我可以定义类似RXVP,{的序列{1}}它与序列匹配,每个序列都在一行中,但按顺序排列。

4 个答案:

答案 0 :(得分:2)

你可以,但可能不是你想要的方式:

如果你的表有一个数字id字段,每行增加,你可以自己加入该表3次(比如说“a”,“b”和“c”)并使用连接条件a。 id + 1 = b.id和b.id + 1 = c.id并将过滤器放在where子句中,例如:a.name ='A'AND b.name ='B'AND c.name ='C'

但不要期待表现......

答案 1 :(得分:1)

假设您知道如何为行提供行号(例如,SQL Server中的ROW_NUMBER()),您可以创建一个查找(匹配)表并加入它。请参阅以下说明:

LookupTable中:

RowNum    Value
1         A
2         B
3         C

您的SourceTable源表(假设您已经向其添加了RowNum - 如果您没有,请为其引入子查询(或SQL Server 2005或更新版本的CTE):

RowNum Name
-----------
1      A
2      B
3      C
4      D

现在您需要在LookupTable.RowNum = SourceTable.RowNum AND LookupTable.Name = SourceTable.Name上使用SourceTable内连接LookupTable。然后仅在RowNum上使用LookupTable对此结果进行左连接。如果最终结果中有LookupTable.RowNum IS NULL,那么您知道至少有一行没有完全匹配。

以下是联接的代码:

SELECT T.*, LT2.RowNum AS Matched 
FROM LookupTable LT2
LEFT JOIN 
(
    SELECT ST.*
    FROM SourceTable ST
    INNER JOIN LookupTable LT ON LT.RowNum = ST.RowNum AND LT.Name = ST.Name
) T
    ON LT2.RowNum = T.RowNum

如果行与LookupTable表中的条件不匹配,则上述查询的结果集将包含Matched IS NULL的行。

答案 2 :(得分:0)

我想你可以为每一行做一个子查询,但它不会表现良好或根本不能很好地扩展,并且难以维护。

答案 3 :(得分:0)

这可能接近你所追求的......但我需要知道你在哪里获得A,B,C等的价值......

Select [insert your fields here]
FROM
(Select T1.Name, T1.Age, RowNum as t1RowNum from T T1 order by name) T1O
Full Outer JOIN 
(Select T2.Name, T2.Age, RowNum as T2rowNum From T T2 order By name) T2O
ON T1O.T1RowNum+1 = T2O.T2RowNum