外连接中的IF / CASE

时间:2012-05-09 19:55:55

标签: mysql sql

我需要连接两个表,其中列(此时,我无法更改该列中使用的值/值)不使用相同的值。因此,根据第一个表中列的值,我需要在第二个表中加入/选择一个特定值。这是我想要做的一个例子(显然不起作用):

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
CASE
WHEN Alert.ObjectType = 'U' THEN Comments.ObjectType = 'USER'
WHEN Alert.ObjectType = 'E' THEN Comments.ObjectType = 'EVENT'
END CASE

所以我想要Alert表中的所有内容,如果Comments表中有相应的记录,我也想要那些。但仅限于适当/匹配的ObjectType。

我已经尝试使用CASE和IF,但我似乎无法让它工作。这样的事情可能吗?

3 个答案:

答案 0 :(得分:4)

CASE语句是返回一个值,而不是执行操作

同时将最后END CASE更改为END

使用返回的值与连接条件进行比较。

尝试:

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType = 
CASE Alert.ObjectType
WHEN 'U' THEN 'USER'
WHEN 'E' THEN 'EVENT'
END

答案 1 :(得分:0)

为什么不呢:

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Alert.ObjectType = LEFT(Comments.ObjectType, 1);

看起来好多了......

修改

根据您的评论,似乎并非所有“匹配”值都以相同的字母开头。在这种情况下,我建议设计一个包含AlertType char(1)和CommentType varchar(50)列的中间表。插入TypeId的每个组合,如U,User; E,事件;您可以修改SQL以阅读

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Intermediate i on Alert.ObjectType = i.AlertType
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType = i.CommentType;

答案 2 :(得分:0)

我建议您使用UNION处理此问题。在一个联合中,用户注释另一个事件评论:

SELECT Alert.*, userComments.Comment
FROM alert
LEFT OUTER JOIN comments usercomments ON userComments.ObjectId = Alert.ObjectId AND usercomments.objecttype='USER'
WHERE alert.objecttype = 'U'
UNION
SELECT Alert.*, eventComments.Comment
FROM alert
LEFT OUTER JOIN comments eventcomments ON eventComments.ObjectId = Alert.ObjectId AND eventcomments.objecttype='EVENT'
WHERE alert.objecttype = 'E'

你不必按照我的方式对它们进行别名 - 它只是有助于提高可读性。