You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Couchbase SQL++中含CASE语句的Left Join查询表现为Inner Join的问题求助

Couchbase SQL++中含CASE语句的Left Join查询表现为Inner Join的问题求助

大家好,我最近在用Couchbase SQL++写查询时碰到了一个棘手的问题:原本想通过Left Join保留左表的全部数据,但加入CASE语句后,查询结果却只返回了有匹配关联数据的行,完全变成了Inner Join的效果,实在搞不懂哪里出问题了。

先给大家看一下我的基础查询,这个查询能正常返回9行符合条件的数据:

SELECT i.id, i.docId, i.proId, i.invRecipientType
FROM pulse i
WHERE i.type = 'pulseInvoice'
  AND i.invRecipientType IN ['cpam', 'b2b', 'b2c']
  AND i.orgId = 'pulseOrganization::S00001'
  AND i.ageId = 'pulseAgency::S00001'
  AND i.invStatus IN ['pending', 'error']
  AND i.sysActive = true
  AND i.invRecordingDate >= '2024-06-01' 
  AND i.invRecordingDate <= '2024-06-07'

返回的结果示例(共9行):

[
  {
    "id": "pulseInvoice::isl98829abd50231111efa73e4311e980c8e3",
    "docId": null,
    "proId": null,
    "invRecipientType": "b2c"
  },
  {
    "id": "pulseInvoice::enugl9e03791024ab11efa035dffe4b27df14",
    "docId": "pulseDoctor::FRMS10002116811",
    "proId": null,
    "invRecipientType": "cpam"
  },
  {
    "id": "pulseInvoice::z0rty6df5e850f58211eeac6b8d2531aa0da6",
    "docId": ...
  },
  // 剩余6行结果省略
]

接下来我想关联另外两个表,根据invRecipientType的不同,用CASE语句返回对应的接收方名称,于是写了下面这个带Left Join和CASE的查询:

SELECT 
  i.id, 
  i.docId, 
  i.proId, 
  i.invRecipientType,
  CASE 
    WHEN i.invRecipientType = 'cpam' THEN d.doctorName
    WHEN i.invRecipientType = 'b2b' THEN c.companyName
    ELSE NULL
  END AS recipientName
FROM pulse i
LEFT JOIN doctors d ON i.docId = d.id AND i.invRecipientType = 'cpam'
LEFT JOIN companies c ON i.proId = c.id AND i.invRecipientType = 'b2b'
WHERE i.type = 'pulseInvoice'
  AND i.invRecipientType IN ['cpam', 'b2b', 'b2c']
  AND i.orgId = 'pulseOrganization::S00001'
  AND i.ageId = 'pulseAgency::S00001'
  AND i.invStatus IN ['pending', 'error']
  AND i.sysActive = true
  AND i.invRecordingDate >= '2024-06-01' 
  AND i.invRecordingDate <= '2024-06-07'

按道理Left Join应该保留左表pulse的所有9行数据,没有匹配关联的行里recipientName显示NULL就好,但实际结果却只返回了3行——只有invRecipientType为cpam且能匹配到doctors表、或者为b2b且能匹配到companies表的行,那些b2c的行直接被过滤掉了,完全是Inner Join的表现。

我反复检查了Join的条件和CASE语句,没发现明显错误,有没有大佬遇到过类似的情况?或者Couchbase SQL++在处理CASE和Left Join结合时有什么特殊的规则?麻烦帮忙指点一下,谢谢!

备注:内容来源于stack exchange,提问作者Gnujeremie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:14:33