首页 > 解决方案 > Cassandra where 子句作为元组

问题描述

      Table12
CustomerId   CampaignID
  1              1
  1              2
  2              3
  1              3
  4              2                   
  4              4
  5              5
val CustomerToCampaign = ((1,1),(1,2),(2,3),(1,3),(4,2),(4,4),(5,5))

是否可以编写类似的查询

select CustomerId, CampaignID  from Table12 where (CustomerId, CampaignID) in (CustomerToCampaign_1, CustomerToCampaign_2)

???

所以输入是一个元组,但列不是元组,而是单个列。

标签: cassandracql

解决方案


当然,这是可能的。但仅限于集群键。这意味着我需要使用其他东西作为分区键或“存储桶”。对于此示例,我将假设营销活动对时间敏感,并且通过使用“月”作为存储桶(分区),我们将获得良好的分布和易于查询。

CREATE TABLE stackoverflow.customertocampaign (
    campaign_month int,
    customer_id int,
    campaign_id int,
    customer_name text,
    PRIMARY KEY (campaign_month, customer_id, campaign_id)
);

现在,我可以INSERT在你的CustomerToCampaign变量中描述数据。然后,此查询有效:

aploetz@cqlsh:stackoverflow> SELECT campaign_month, customer_id, campaign_id
                             FROM customertocampaign WHERE campaign_month=202004 
                             AND (customer_id,campaign_id) = (1,2);

 campaign_month | customer_id | campaign_id
----------------+-------------+-------------
         202004 |           1 |           2

(1 rows)

推荐阅读