如何从 couchbase 中获取缺失值列名

How to get missing value column name from couchbase

我是 运行 查询,它没有当前日期值,我已经尝试使用 ifmissing() 函数来获取列名,但在某些情况下它不起作用,我不知道原因。

我的查询是:

SELECT SPLIT(DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,'.')[0],7,‘hour'),‘T') [0],
    ADD (TONUMBER(SPLIT(SPLIT (ev.auditDetail.createTime, 'T')[1], ‘:')[0]),7) AS HOUR,
    COUNT (*) AS COUNT
    FROM data_KH ev
    WHERE type_ = ‘user’
    AND DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,‘.')[0],7,‘hour’) >
    CLOCK_TZ (‘Asia/Bangkok', '1111-11-11‘)
    AND SPLIT (loginId,‘@‘)[1] NOT IN [‘yopmail.com', ‘ymail.com', ‘accoliteindia.com']
    GROUP BY SPLIT (DATE_ADD_STR(SPLIT(ev. auditDetail.createTime,'.')[0],7,'hour'),‘T‘) [0],
    ADD (TONUMBER (SPLIT (SPLIT (ev.auditDetail.createTime, ‘T')[1], ‘:')[0]),7)
    ORDER BY SPLIT (DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,'.')[0],7,'hour'),‘T') [0],
    ADD (TONUMBER (SPLIT (SPLIT (ev. auditDetail.createTime, 'T')[1], ':')[0]),7)

我修改了主查询有子查询,如果在主查询中找不到结果则创建静态结果

SELECT [{'':split (DATE_ADD_STR(SPLIT(clock_utc(),'.')[0],7,hour),'T')[0], COUNT':0,
HOUR' : add(TONUMBER(SPLIT (clock_utc('11:11:11'), ':')[0],7)}] AS ‘alterData’,
(SELECT SPLIT(DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,'.')[0],7,‘hour'),‘T') [0],
    ADD (TONUMBER(SPLIT(SPLIT (ev.auditDetail.createTime, 'T')[1], ‘:')[0]),7) AS HOUR,
    COUNT (*) AS COUNT
    FROM data_KH ev
    WHERE type_ = ‘user’
    AND DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,‘.')[0],7,‘hour’) >
    CLOCK_TZ (‘Asia/Bangkok', '1111-11-11‘)
    AND SPLIT (loginId,‘@‘)[1] NOT IN [‘yopmail.com', ‘ymail.com', ‘accoliteindia.com']
    GROUP BY SPLIT (DATE_ADD_STR(SPLIT(ev. auditDetail.createTime,'.')[0],7,'hour'),‘T‘) [0],
    ADD (TONUMBER (SPLIT (SPLIT (ev.auditDetail.createTime, ‘T')[1], ‘:')[0]),7)
    ORDER BY SPLIT (DATE_ADD_STR(SPLIT (ev. auditDetail.createTime,'.')[0],7,'hour'),‘T') [0],
    ADD (TONUMBER (SPLIT (SPLIT (ev. auditDetail.createTime, 'T')[1], ':')[0]),7)) AS ‘data’

子查询结果为ARRAY,如果没有结果则长度为0(不是MISSING)。 子查询结果有 EXIST/NOT EXIST。因为您也需要结果并且不想重复查询两次。您也可以使用以下方法。

CB 6.5 或以上

WITH result AS (SELECT DATE_FORMAT_STR(crdate, "2020-01-01") AS date,
                       DATE_PART_STR(crdate, "hour") AS hour,
                       COUNT (1) AS count
                FROM data_KH AS ev
                LET crdate = DATE_ADD_STR(SPLIT(ev.auditDetail.createTime, ".")[0], 7, "hour")
                WHERE type_ = "user"
                    AND crdate > CLOCK_TZ ("Asia/Bangkok", "1111-11-11")
                    AND SPLIT (loginId,"@")[1] NOT IN ["yopmail.com", "ymail.com", "accoliteindia.com"]
                GROUP BY DATE_FORMAT_STR(crdate, "2020-01-01"), DATE_PART_STR(crdate, "hour"))
SELECT d.*
FROM (CASE WHEN ARRAY_LENGTH(result) > 0 THEN result ELSE [{"date": CLOCK_TZ("Asia/Bangkok","2020-01-01"),
                                                      "hour":DATE_PART_STR(CLOCK_TZ("Asia/Bangkok"), "hour"),
                                                      "count":0}]
                                               END) AS d
ORDER BY d.date, d.hour;

CB 6.50 之前

SELECT d.*
FROM ARRAY_FLATTEN ((SELECT RAW CASE WHEN ARRAY_LENGTH(result) > 0
                                    THEN result
                                    ELSE [{"date": CLOCK_TZ("Asia/Bangkok","2020-01-01"),
                                           "hour":DATE_PART_STR(CLOCK_TZ("Asia/Bangkok"), "hour"),
                                           "count":0}]
                                    END
                    LET result = (SELECT DATE_FORMAT_STR(crdate, "2020-01-01") AS date,
                                         DATE_PART_STR(crdate, "hour") AS hour,
                                         COUNT (1) AS count
                                  FROM data_KH AS ev
                                  LET crdate = DATE_ADD_STR(SPLIT(ev.auditDetail.createTime, ".")[0], 7, "hour")
                                  WHERE type_ = "user"
                                      AND crdate > CLOCK_TZ ("Asia/Bangkok", "1111-11-11")
                                      AND SPLIT (loginId,"@")[1] NOT IN ["yopmail.com", "ymail.com", "accoliteindia.com"]
                                  GROUP BY DATE_FORMAT_STR(crdate, "2020-01-01"), DATE_PART_STR(crdate, "hour"))),1) AS d
ORDER BY d.date, d.hour;

您也可以使用 STR_TO_TZ(ev.auditDetail.createTime,"Asia/Bangkok") 代替 DATE_ADD_STR(SPLIT(ev.auditDetail.createTime, ".")[0 ], 7, "小时") https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/datefun.html