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

Azure Cosmos DB SQL API是否支持类似PostgreSQL LIKE ANY的匹配查询?

在Azure Cosmos DB SQL API中实现数组匹配手机号的方法

一、原生SQL实现(无需UDF)

直接利用Cosmos DB的数组迭代和内置函数即可实现需求,避免UDF带来的各种问题。假设文档中存储带国家码的手机号字段为phoneNumber,传入的无国家码手机号数组为["4161231234","7202228799"],可使用以下查询:

SELECT c.user_id
FROM c
WHERE EXISTS (
    SELECT VALUE 1
    FROM contact IN ["4161231234","7202228799"]
    WHERE ENDSWITH(c.phoneNumber, contact)
)
  • 逻辑说明:通过EXISTS子查询遍历数组,只要有一个手机号匹配文档中手机号的后缀(符合带国家码的匹配场景),就返回对应的user_id;若需模糊匹配(手机号中间包含目标号码),将ENDSWITH替换为CONTAINS即可。
  • 参数化调用(推荐,避免硬编码):
SELECT c.user_id
FROM c
WHERE EXISTS (
    SELECT VALUE 1
    FROM contact IN @contacts
    WHERE ENDSWITH(c.phoneNumber, contact)
)

调用时直接传入参数@contacts为原生数组["4161231234","7202228799"],可避免$1格式异常问题。

二、修复UDF实现(若必须使用UDF)

如果坚持用UDF,需修正数组处理逻辑,解决之前的格式、空结果、长度获取问题:

1. 创建正确的UDF

function matchesPhone(phoneNumber, contacts) {
    // 先做参数合法性校验
    if (!phoneNumber || !contacts || !Array.isArray(contacts)) {
        return false;
    }
    // 遍历数组匹配
    for (let i = 0; i < contacts.length; i++) {
        if (phoneNumber.endsWith(contacts[i])) {
            return true;
        }
    }
    return false;
}

2. 调用UDF的查询

SELECT c.user_id
FROM c
WHERE udf.matchesPhone(c.phoneNumber, ["4161231234","7202228799"])

或参数化调用:

SELECT c.user_id
FROM c
WHERE udf.matchesPhone(c.phoneNumber, @contacts)

问题修复点

  • 数组格式异常:使用参数化方式传入原生数组,不要手动拼接数组字符串;
  • 空结果:检查匹配逻辑方向(是文档手机号包含目标号码,而非反过来),并增加参数合法性校验;
  • 无法获取数组长度:先判断contacts是否为数组类型,再访问length属性。

三、性能优化建议

  • 优先使用原生SQL:UDF无法利用索引,原生ENDSWITH配合phoneNumber字段的范围索引,性能更优;
  • 固定长度匹配:若目标手机号长度固定(如都是10位),可截取文档手机号的对应长度后再匹配,性能最佳:
SELECT c.user_id
FROM c
WHERE ARRAY_CONTAINS(["4161231234","7202228799"], RIGHT(c.phoneNumber, 10))

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:25:24