2016-08-20 50 views
0

我不是SQL专家,但我听说过这种情况,我无法将它包裹起来。从表格中选择数据,并在另一个表格中输入条件

比方说,我有2个表。其中一人拥有关于物体的所有信息。另一个包含所选信息的布尔值。

| p_id | firstname | lastname | age | 
| 1 | John  | Smith | 33 | 
| 2 | Mickey | Mouse | 88 | 
... 

personinfo

| i_id | firstname | lastname | age  | p_id | 
| 1 | true  | true  | true | 1 | 
| 2 | true  | true  | false | 2 | 
... 

而现在,是有可能选择*从人,其中的p_id = 2得到的只有名字和姓氏,因为年龄personinfo表是假的?有点不好的例子,但无论如何,谢谢!

+0

我假设你的意思是'i_id = 2'。 –

回答

0

不是。 SQL查询返回一组固定的列,因此您需要返回结果集中的所有列。你可以,但是,基于第二表中设置列NULL

select p.p_id, 
     (case when pi.firstname then p.firstname end) as firstname, 
     (case when pi.lastname then p.lastname end) as lastname, 
     (case when pi.age then p.age end) as age 
from person p cross join 
    personinfo pi 
where pi.i_id = 2; 

第二种方法是使用personinfo生成带有适当的列动态SQL,然后准备和执行该语句。

0

不是一个很好的解决方案,但会做你所要求的东西,除非你给你的问题的更多信息:通过创建临时表,你可以得到不依赖于更广义的数据

If EXISTS(Select 0 FROM PersonInfo Where p_id = 2 and age = false) 
BEGIN 
Select firstname, lastname from person where p_id = 2 
END 
ELSE 
BEGIN 
Select firstname, lastname, age from person where p_id = 2 
END 

更好的解决方案特别是p_id。假设p_id是int:

Create Table #Temp 
{ 
    pid int 
} 

Insert Into #Temp 
Select p_id from PersonInfo where age = false 

Select firstname, lastname from person where p_id In (Select pid from #Temp) 
Select firstname, lastname, age from person where p_id Not In (Select pid from #Temp) 
0

我想你是问一个更一般的问题。如果给定列的PersonInfo表中存在错误值,则不要返回Person表中的相应值。对?这就是我的问题所在:

SELECT p.p_id, 
CASE WHEN i.firstname = 'true' THEN p.firstname END AS firstname, 
CASE WHEN i.lastname = 'true' THEN p.lastname END AS lastname, 
CASE WHEN i.age = 'true' THEN p.age END AS age 
FROM Person p LEFT JOIN PersonInfo i 
ON p.p_id = i.p_id 

在上例中,输出为Micky Mouse的年龄提供了NULL。

相关问题