从表中选择具有另一个表中的条件的数据

时间:2016-08-20 17:55:01

标签: sql

我不是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是假的?有点不好的例子,但无论如何,谢谢!

3 个答案:

答案 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。