gpt4 book ai didi

sql - 我可以将一堆 boolean 列转换为 PostgreSQL 中的单个位图吗?

转载 作者:行者123 更新时间:2023-11-29 11:20:28 33 4
gpt4 key购买 nike

我想转换如下查询:

SELECT BoolA, BoolB, BoolC, BoolD FROM MyTable;

进入位掩码,其中位由上述值定义。

例如,如果 BoolABoolD 为真,我想要 10019

我的想法是:

SELECT
CASE WHEN BoolD THEN 2^0 ELSE 0 END +
CASE WHEN BoolC THEN 2^1 ELSE 0 END +
CASE WHEN BoolB THEN 2^2 ELSE 0 END +
CASE WHEN BoolA THEN 2^3 ELSE 0 END
FROM MyTable;

但我不确定这是否是最好的方法并且看起来相当冗长。有没有简单的方法可以做到这一点?

最佳答案

对于位掩码,类型 bitstring会是更好的选择。可能看起来像这样:

SELECT BoolD::int::bit
|| BoolC::int::bit
|| BoolB::int::bit
|| BoolA::int::bit
FROM tbl;

true 转换为 1false 转换为 0。您可以简单地将位连接到位串。

将 bit(n) 转换为整数

看来您需要一个整数作为结果——有一个简单快速的方法:

SELECT (BoolD::int::bit
|| BoolC::int::bit
|| BoolB::int::bit
|| BoolA::int::bit)::bit(4)::int
FROM tbl;

请务必阅读手册“Bit String Functions and Operators”一章中的细则。


我想出了另外两个想法,并用 10k 行进行了快速测试/引用以总结所有内容。

测试设置:

CREATE TEMP TABLE t (boola bool, boolb bool, boolc bool, boold bool);
INSERT INTO t
SELECT random()::int::bool
, random()::int::bool
, random()::int::bool
, random()::int::bool
FROM generate_series(1,10000);

演示:

SELECT  CASE WHEN boold THEN 1 ELSE 0 END
+ (CASE WHEN boolc THEN 1 ELSE 0 END << 1)
+ (CASE WHEN boolb THEN 1 ELSE 0 END << 2)
+ (CASE WHEN boola THEN 1 ELSE 0 END << 3) AS andriy

, boold::int
+ (boolc::int << 1)
+ (boolb::int << 2)
+ (boola::int << 3) AS mike

, (boola::int::bit
|| boolb::int::bit
|| boolc::int::bit
|| boold::int::bit)::bit(4)::int AS erwin1

, boold::int
| (boolc::int << 1)
| (boolb::int << 2)
| (boola::int << 3) AS erwin2

, (((
boola::int << 1)
| boolb::int << 1)
| boolc::int << 1)
| boold::int AS erwin3
FROM t
LIMIT 15;

您也可以使用 |(按位或)代替 + 运算符。
单独的测试运行显示所有五种方法的性能基本相同。

关于sql - 我可以将一堆 boolean 列转换为 PostgreSQL 中的单个位图吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9051886/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com