重复字符串上的 SQL 等效“$all”MongoDB 运算符

Posted

技术标签:

【中文标题】重复字符串上的 SQL 等效“$all”MongoDB 运算符【英文标题】:SQL equivalent "$all" MongoDB operator on Repeated string 【发布时间】:2020-12-29 16:41:15 【问题描述】:

假设如下数据结构:

MongoDB:id:ObjectId,颜色:String[] SQL:列 ID(整数)、列颜色(重复字符串)

假设以下 MongoDB 查询:

collection.find(colors: $all: ["blue", "orange", "yellow"] )

SQL 中“$all”的等效运算符/符号是什么?请注意,与 $in 不同,$all 查找具有匹配所有值的该字段的文档(行),而不仅仅是其中的“一些”。

【问题讨论】:

【参考方案1】:

假设重复值没有重复,可以使用:

select s.*
from sql s
where (select count(*)
       from unnest(s.colors) color
       where color in ('blue', 'orange', 'yellow')
      ) = 3;

“3”是列表的大小。如果有重复,请改用count(distinct color)

如果不想“记住”3,可以使用:

with color_list as (
      select color
      from unnest(array['blue', 'orange', 'yellow']) color
     )
select s.*
from sql s
where (select count(*)
       from unnest(s.colors) color join
            color_list cl
            using (color)
      ) = (select count(*) from color_list);

甚至:

select s.*
from sql s
where not exists (select 1
                  from unnest(array['blue', 'orange', 'yellow']) my_color left join
                       unnest(s.colors) color
                       on my_color = color
                  where color is null
                 );

【讨论】:

【参考方案2】:

以下是 BigQuery 标准 SQL

#standardSQL
create temp function check_all(arr ANY TYPE, match ANY TYPE) as (
  array_length(array(
    select distinct m from unnest(match) m 
    join unnest(arr) m using(m)
  )) = array_length(array(
    select distinct m from unnest(match) m 
  ))
);
select *
from `project.dataset.table`
where  check_all(colors, ['blue', 'orange', 'yellow'])    

如果适用于以下虚拟样本数据

with `project.dataset.table` as (
  select 1 id, ['blue', 'orange', 'yellow', 'black'] colors union all
  select 2, ['blue', 'pink', 'yellow', 'green'] union all
  select 3, ['red', 'orange', 'blue', 'pink', 'yellow', 'green'] 
)

输出是

【讨论】:

以上是关于重复字符串上的 SQL 等效“$all”MongoDB 运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongo db 上按 Java 文本搜索 [重复]

等效于 Linux 上的 Win32 性能计数器 [重复]

MySQL 限制的 SQL Server 等效项 [重复]

LINQ 和 SQL 中看似等效的查询返回不同的结果 [重复]

Pandas 等效于 SQL CROSS JOIN(笛卡尔积)[重复]

等效于 mongo 的 out:reduce 选项在 hadoop