【发布时间】:2021-01-13 23:47:30
【问题描述】:
多年来,作为一名 C 程序员,我一直在使用位掩码,我正试图在 Postgres 中做类似的事情,但它并没有像我预期的那样工作。所以这是一个有 2 列的表定义:
dummy
(
countrymask BIT VARYING (255) not null, -- Yes it's a pretty wide bitmask
countryname CHARACTER VARYING NOT NULL,
);
因此,“虚拟”表中的一些数据将是:
现在,使用掩码单选返回阿尔巴尼亚、亚美尼亚和白俄罗斯的 SQL 是什么? (即'100010001')
我以为会是这样的:
SELECT * FROM DUMMY WHERE (countrymask & (b'100010001')) <> 0;
但我遇到了类型不匹配的问题。我希望得到一些帮助。 但是,当类型转换被整理出来时,这会起作用吗?
【问题讨论】:
-
关系数据库不是 C 程序。使用位掩码并不适合关系模型。正确规范化的模型将更易于使用。
create table dummy (id integer primary key, country_name varchar(100)) -
好吧,我们一直对表进行非规范化以提高性能,因此雪花模式等。该数据库中有数百万行,我们希望根据需要选择不同的国家/地区集。所以该集合中包含所有国家名称 - 大约 200 个独立国家。使用标准的“IN”子句非常慢,尤其是使用国家名称(文本)会强制进行多个表扫描。欢迎对此提出任何想法。
-
我看不出 IN 子句会如何导致 多个 表扫描。
标签: sql postgresql select bitmask