WHERE子句上的Couchbase子查询

时间:2016-11-12 20:45:16

标签: sql subquery couchbase

所以我试图在我的数据库上运行查询,该查询将根据用户名和密码获取用户名的信息,但两者都在同一个表中。当我运行代码时:

SELECT subscriberRef
FROM csp
WHERE username = "ville" AND pass = "ppp"

我得到了正确的参考资料,即:" S:1"但是当我在WHERE子句中对它进行子查询时,这样:

SELECT *
FROM csp 
WHERE META(csp).id = (SELECT subscriberRef 
                     FROM csp as csp1
                     WHERE username = "ville" AND pass = "ppp")

返回[]。 为什么?????????

2 个答案:

答案 0 :(得分:2)

当您从第一个查询获得结果时,您将获得一个JSON数组,这不能等同于一个简单的String。

例如该查询

SELECT  subscriberRef 
FROM webinar as w
WHERE username = "ppp" AND `password` = "vvv"

你会得到那个结果:

[
  {
    "subscriberRef": "person::1"
  }
]

我能想到解决问题的最好方法是使用raw关键字来获取值的简单JSON数组。

SELECT  raw subscriberRef 
FROM webinar as w
WHERE username = "ppp" AND `password` = "vvv"

结果:

[
  "person::1"
]

从这里你可以建立你的查询:

select *
from myBucket
where meta().id in (
SELECT raw subscriberRef 
FROM myBucket as w
WHERE username = "ppp" AND `password` = "vvv")

现在我不会使用" ="但是"在"因为这是一个数据数组(有1个值)

答案 1 :(得分:0)

我认为这是因为子查询的结果不是字符串,而是具有一个字段的对象。例如。 “foo”与{“bar”:“foo”}不一样。

我不知道是否有解决方法(可能存在),但您是否考虑过使用JOIN转向其他方向?类似的东西:

SELECT csp.*
FROM `default` csp1
JOIN `default` csp ON KEYS csp1.subscriberRef
WHERE csp1.username = "ville" and csp1.pass = "ppp"