【问题标题】:Select column names and querying "LIKE" on Couchbase在 Couchbase 上选择列名并查询“LIKE”
【发布时间】:2020-05-01 15:38:16
【问题描述】:

我想从存储桶中获取所有列名。

我找到了一个查询:

SELECT ARRAY_DISTINCT(ARRAY_AGG(v)) AS column
FROM mybucket b UNNEST object_names(b) AS v

它正在获取列名数组,但我需要LIKE SQL 命令。是这样的:

SELECT column
FROM mybucket
WHERE column LIKE '%test%'

有没有办法做到这一点?

【问题讨论】:

    标签: sql couchbase n1ql


    【解决方案1】:

    OBJECT_NAMES() 仅给出顶级字段名称(不包括嵌套字段) https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/objectfun.html

    SELECT DISTINCT v AS column
    FROM mybucket b UNNEST OBJECT_NAMES(b) AS v
    WHERE v LIKE "%test%";
    

    【讨论】:

      【解决方案2】:

      这是一个棘手的问题,具体取决于您希望得到的结构是什么。免责声明,可能有更简洁的方式来做到这一点(但我还没有找到它——也许还有另一种方式不涉及OBJECT_NAMES?)。

      但无论如何,对我来说,关键是ARRAY collection operator

      例如,这个:

      SELECT ARRAY a FOR a IN ARRAY_DISTINCT(ARRAY_AGG(allFieldNames))
             WHEN a LIKE '%test%' END AS filteredFieldNames
      FROM mybucket b UNNEST object_names(b) AS allFieldNames
      

      会返回类似的结果

      [
        {
          "filteredFieldNames": [
            "testField1",
            "anotherTestField"
          ]
        }
      ]
      

      如果您需要不同的格式,可以使用 ARRAY 运算符表达式。例如:

      SELECT ARRAY { "fieldName" : a } FOR a IN 
             ARRAY_DISTINCT(ARRAY_AGG(allFieldNames))
             WHEN a LIKE '%test%' END AS filteredFieldNames
      FROM mybucket b UNNEST object_names(b) AS allFieldNames
      

      哪个会返回:

      [
        {
          "filteredFieldNames": [
            {
              "fieldName": "testField1"
            },
            {
              "fieldName": "anotherTestField"
            }
          ]
        }
      ]
      

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2018-08-13
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        相关资源
        最近更新 更多