我不是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的人中选择*来获取firstname和lastname,因为personinfo表中的age是假的?有点不好的例子,但无论如何,谢谢!
答案 0 :(得分:0)
不是真的。 SQL查询返回一组固定的列,因此您需要返回结果集中的所有列。但是,您可以根据第二个表将列设置为white_list_sanitizer.sanitize_css('background-color: #000;')
:
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;
生成具有相应列的动态SQL,然后准备并执行该语句。
答案 1 :(得分: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)
答案 2 :(得分:0)
我认为你问的是一个更普遍的问题。如果给定列的PersonInfo表中存在false值,请不要在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。