求助:将MySQL的LIKE CONCAT语句转换为等价Kusto KQL语句
解决MySQL转KQL的动态匹配问题
你碰到的核心问题是KQL的matches regex运算符只支持常量正则表达式,没法直接用列作为匹配规则。而你的需求是基于name列动态生成匹配逻辑来校验capital列,这时候就得用KQL的regex_match()函数——它支持把列作为正则表达式参数。
正确的KQL转换写法
对应你原MySQL查询SELECT name FROM world WHERE capital LIKE CONCAT(name, '%city'),可以这样写:
world | where regex_match(capital, strcat("^", name, ".*city$")) | project name
逻辑对应说明
原MySQL的LIKE CONCAT(name, '%city')是要求:capital必须以name开头,中间可以是任意长度的任意字符(包括空),最后以city结尾。strcat("^", name, ".*city$")会为每一行动态生成正则规则:^标记字符串开头,.*匹配任意长度任意字符,$标记字符串结尾,完美对应原LIKE的匹配逻辑。
可选:开启不区分大小写匹配
如果你的MySQL查询是不区分大小写的(比如默认的LIKE行为),可以给regex_match()加第三个参数"i"来启用大小写不敏感模式:
world | where regex_match(capital, strcat("^", name, ".*city$"), "i") | project name
为什么之前的写法失效?
matches regex运算符要求右侧必须是固定的常量字符串,不能是列或者动态生成的表达式,所以你尝试的where capital matches regex strcat(name,".*city"),以及用extend生成列后匹配的写法都不生效。regex_match()是函数类型的匹配方式,支持将列作为正则参数,刚好满足这种动态匹配的需求。
内容的提问来源于stack exchange,提问作者sheldonzy
相关产品推荐
相关产品推荐

