当前位置: 首页 > 面试题库 >

我可以在PostgreSQL中将一堆布尔列转换为单个位图吗?

韦衡
2023-03-14
问题内容

我想转换一个查询,例如:

SELECT BoolA, BoolB, BoolC, BoolD FROM MyTable;

进入一个位掩码,其中的位是由上面的值定义的。

例如,如果BoolABoolD为true,则我想要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皈依1FALSE0。您可以简单地将位连接为位串。

将bit(n)转换为整数

看来您需要一个integer结果-有一个简单而快速的方法:

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

请务必阅读本手册“位字符串函数和运算符”一章中的详细说明。

我提出了另外两个想法,并结合了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

您也可以使用按位或| 而不是+运算符。
单独的测试运行 显示出这五种方法的基本 相同的性能



 类似资料:
  • 我正在尝试将一个PostgreSQL表迁移到一个包含所有数据的MySQL,但由于有两列,我无法迁移。这些列在Postgresql表中作为布尔值,并且这些列中的值为TRUE或FALSE(看起来像字符串)。我在MySQL中创建了一个布尔列,但它不接受真/假数据。对于这些真/假值,我应该使用什么来代替布尔值?我尝试了tinyint(4),但它不起作用(我必须迁移数据,因为它是真的或假的,而不是t/f或1

  • 问题内容: 在Java中将a转换boolean为an 的最常用方法是什么int? 问题答案: ^^ PS : true = 1 and false = 0

  • 问题内容: 我目前正在开发一个Scala应用程序,该应用程序利用Spring-Boot和Swagger发送和接收REST调用。 Swagger和Spring-Boot是纯Java项目,与Scala的兼容性有限,但是我似乎找到了解决该问题的方法。 由于Spring- Boot和Swagger将请求作为Java对象处理(需要使用setter和getter才能工作),因此我必须将请求视为Java对象,然

  • 问题内容: 可以说我在PostgreSQL中有一个带有以下各列的表: 我插入了这两行: 我想将上面的行转换为此(在PostgreSQL中进行选择): 调用PHP 并得到这样的东西: 但是现在,如果我用php调用,我会得到: 希望有人能帮助我解决这个问题,谢谢大家 问题答案: 在9.4中很简单(使用了LATERAL join和jsonb函数): 确切结果:

  • 问题内容: 为什么没有单元的情况下,以下转换在Firefox中不起作用?一旦添加单位,它就可以工作。似乎其他主要的浏览器对这些单位都漠不关心。 据我所知,这是过渡时间“ 0”的唯一示例,没有单位,在Firefox中不起作用。 您可以在JSFiddle上看到它的运行以及与单元的配合。 这是在JSFiddle上没有单元且相同的相同代码。 如您所见,Firefox是唯一似乎崩溃的浏览器。另外,这是代码:

  • 本文向大家介绍wpf 将布尔值转换为可见性值,包括了wpf 将布尔值转换为可见性值的使用技巧和注意事项,需要的朋友参考一下 示例 如果未通过使用选中复选框,则此示例隐藏红色框(边框)IValueConverter。 注:在BooleanToVisibilityConverter下面的示例中使用的是内置值转换器,设在System.Windows.Controls命名空间。 XAML: