对于位掩码,类型
bitstring
将是更好的选择。可能看起来像这样:
SELECT BoolD::int::bit
|| BoolC::int::bit
|| BoolB::int::bit
|| BoolA::int::bit
FROM tbl;
true
转换为 1
,false
转换为 0
。您可以简单地将位连接成位字符串。
将 bit(n) 转换为整数
看起来您需要一个 整数
作为结果 - 这有一个简单且快速的方法:
SELECT (BoolD::int::bit
|| BoolC::int::bit
|| BoolB::int::bit
|| BoolA::int::bit)::bit(4)::int
FROM tbl;
确保阅读手册中第 "
位串函数和运算符" 章节的细则。
我想到了另外两个点子,并且快速地整理了一个包含1万行的测试/参考文件,以总结所有内容。
测试设置:
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;
你也可以使用位或运算符
|
代替加法运算符
+
。
单独的测试运行显示五种方法基本上具有相同的性能。
bit varying
类型转换为布尔数组,这不是我想要的。虽然我需要尝试一下才能确认,因为我找不到任何文档记录它。 - Mike Christensenbit varying
转换为一个字符串,看起来像"1001"
- 因此,尽管这种方法在某些情况下可能是有效的,但并不完全符合我的要求。 - Mike Christensentrue
在PostgreSQL中可能会转换为-1
,而不是像在MySQL中一样转换为1
。后来证明是错误的,所以我最终又确认了我的最初猜测。另外,如果您将整个表达式转换为int
,我认为您的想法对Mike可能有效。 - Andriy M