从两个不同列表中选择两列,每列列名不同
我无法确定此查询。我使用PHP和postgresql 9.1。我希望能够根据另一个字段中的条件从行中选择字段,如下所示。从两个不同列表中选择两列,每列列名不同
表A
有列:
vid, title, description, col4, col5, col6, col7
表B
有列:
pid, title, description, colx, coly
我要搜索title
和description
两个表,如果发现匹配,返回vid
或pid
它被发现的行。
我试过了远:
SELECT vid FROM tableA WHERE title LIKE %somevalue%
UNION
SELECT pid FROM tableB WHERE title LIKE %somevalue%
问题是,当我做到这一点,它找到tableB
匹配返回正确的值,但在阵列中分配给vid
柱。 PHP的阵列显示
Array ([0] => Array ([vid] => 100007))
当它应该是
Array ([0] => Array ([pid] => 100007))
它不给我正确的列名的表。它只给我第一个select语句的列名。
此外,它只返回一个或另一个。如果在两个列中均找到该值,我希望这两个列都具有这两个值。
SELECT
a.vid,
b.pid
FROM (
SELECT vid, ROW_NUMBER() OVER (ORDER BY vid) AS rn
FROM tableA
WHERE title LIKE '%somevalue%'
) a
FULL JOIN (
SELECT pid, ROW_NUMBER() OVER (ORDER BY pid) AS rn
FROM tableB
WHERE title LIKE '%somevalue%'
) b
ON a.rn = b.rn
这与我正在寻找的东西非常接近。不太清楚它是如何工作的,但它是有效的。虽然我宁愿不把它的空栏回来,它仍然是最好的答案,并按我的想法工作。我将使用PHP来处理我猜想的空键/值。 – 2012-03-09 03:50:36
查询的结果应该包含一组固定的列。如果您希望它是动态的,则查询本身应该动态构建。不知道PostgreSQL是否允许你构建和执行动态查询,但我毫不怀疑最终查询比这里提供的任何解决方案都要复杂。所以是的,在客户端代码中处理空值是一个好主意,这就是我最可能选择做的事情。 – 2012-03-09 07:33:27
您可以编写类似:
SELECT 'vid' AS key, vid, NULL AS pid FROM tableA WHERE title LIKE ...
UNION
SELECT 'pid', NULL, pid FROM tableB WHERE title LIKE ...
无法正常工作,因为我需要它。与Martin的 – 2012-03-09 00:51:24
@Pjack相同:在这种情况下,听起来你并不想要一个'UNION'! – ruakh 2012-03-09 01:01:44
好吧然后我需要检索两个列名称,它找到的值? – 2012-03-09 01:07:54
是你所要求的不可能与一个单一的查询和UNION。根据w3schools的说法,当您使用UNION时,这些列将被迫匹配第一条select语句。
没有用:/它所做的只是拉列名Array([0] => Array([vid] => 100007 [pid] =>)),但它甚至不应该有vid在那里应该是Array([0 ] => Array([pid] => 100007)) – 2012-03-09 00:49:47
我相信SQL会强制执行联合时所有结果具有相同的列。为什么不只是运行两个查询? – Martin 2012-03-09 00:52:58
好吧然后,我需要检索两个列名称,它发现的价值?它需要在一个声明中,而不是在子选择中。 – 2012-03-09 01:08:16
尝试: -
SELECT vid as 'id', 'isVid' as idType FROM tableA WHERE title LIKE ...
UNION
SELECT pid as 'id', 'isPid' as idType FROM tableB WHERE title LIKE ...
肯定有人知道如何选择语句结合起来,得到正确的结果。由于联合不正确,哪些子查询会起作用呢? – 2012-03-09 01:51:55