我有一张表tbl_Info
:
InfoId
Text
PrivacyTypeId
UserName
TypeId
IsInfo
InfoItemId
数据示例:
1|Some text...|1|userX|1|False|NULL
2|New job created|1|system|3|True|765
3|Image commented|1|system|4|True|457
在我的应用程序中,我从此表中获取所有值,并将其显示为列表。
应用程序用户可以单击每个项目,并且应该将它们重定向到应用程序中的某个位置。
我在数据库中有几个绑定到此表的表,但此连接非常动态。例如,这个表:
tbl_Jobs{JobId, Title etc.}, tbl_Articles{ArticleId, Title etc.}
问题在于:
在我添加IsInfo
和InfoItemId
之前,我只有一种用户输入此信息的类型,我只需要获取信息列+用户全名:
select i.*, p.FirstName + ' ' + p.LastName as Author
from tbl_Info i
left join tbl_Profiles p on i.UserName = p.UserName
where i.PrivacyTypeId = 1
现在我需要更改名为Author
的{{1}}列,此值应为:全名或职位或文章标题等。
我不知道是否可以制作选择程序,因此它可以基于Title
和IsInfo
从ID为TypeId
的另一个表中获取项目标题。
如下所示:如果IsInfo = True。获取typeId。并基于此typeId连接到某个表并从中获取一些列。
InfoItemId
对不起,我很抱歉。但我无法找到解决方案,我需要更详细地解释一下问题。
答案 0 :(得分:11)
SELECT
CASE typeID
WHEN 1 THEN tbl_Profiles.FirstName + ' ' + tbl_Profiles.LastName
WHEN 2 THEN ...
WHEN 3 THEN ...
END AS Title
FROM tbl_Info
LEFT OUTER JOIN tbl_Profiles ON
tbl_Info.UserName = tbl_Profiles.UserName
AND typeID = 1
LEFT OUTER JOIN tbl_Jobs ON
....
AND typeID = 2
LEFT OUTER JOIN tbl_Articles ON
....
AND typeID = 3
答案 1 :(得分:2)
我可能错过了一些东西,但是在第一次检查时,您可以通过使用简单的IF语句来解决在给定存储过程中需要两个代码路径的问题。
IF (ConditionIsTrue)
BEGIN
-- First form of select statement
END
ELSE
BEGIN
-- Second form of select statement
END
答案 2 :(得分:2)
如果您需要在一个大列表中显示数据,可以使用联合将它们绑定在一起:
SELECT i.*, p.FirstName + ' ' + p.LastName as Author
FROM tbl_Info i
INNER JOIN tbl_Profiles p ON i.UserName = p.UserName
WHERE i.PrivacyTypeID=1
UNION ALL
SELECT i.*, j.Title
FROM tbl_Info i
INNER JOIN tbl_Jobs j ON ...
WHERE i.PrivacyTypeID=2
...
否则,如果你真的只是希望一次显示不同的东西(即只是简介,只是工作等),那么请使用John Sansom的答案,用IF语句包装它