我想转换一个查询,例如:
SELECT BoolA, BoolB, BoolC, BoolD FROM MyTable;
进入一个位掩码,其中的位是由上面的值定义的。
例如,如果BoolA
和BoolD
为true,则我想要1001
或9
。
我想到以下几点:
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
皈依1
,FALSE
对0
。您可以简单地将位连接为位串。
看来您需要一个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: