Thread: cast bit to boolean?
How might one case a BIT to a BOOLEAN? For example, I want to return rows which have non-zero bit representation for, say, (sel_a & b'0011'). That is, rows with the first or second bit set. I tried an explicit CAST, and just the query directly, but the cast say you cant cast type 'bit' to 'bool', and the direct query says WHERE clause must return type bool, not type bit: create table t1 (sel_a BIT(6),sel_b BIT(6)); insert into t1 values (b'000001',b'001000'); select * from t1 where sel_a & b'100001'; ERROR: WHERE clause must return type bool, not type bit Where might I look for this? The manual is quite sparse regarding BIT types. Thanks.
On Thu, 3 May 2001, Vivek Khera wrote: > How might one case a BIT to a BOOLEAN? For example, I want to return > rows which have non-zero bit representation for, say, (sel_a & b'0011'). > That is, rows with the first or second bit set. > > I tried an explicit CAST, and just the query directly, but the cast > say you cant cast type 'bit' to 'bool', and the direct query says > WHERE clause must return type bool, not type bit: > > create table t1 (sel_a BIT(6),sel_b BIT(6)); > insert into t1 values (b'000001',b'001000'); > select * from t1 where sel_a & b'100001'; > ERROR: WHERE clause must return type bool, not type bit > > Where might I look for this? The manual is quite sparse regarding BIT > types. There might be a better way, but you can write a conversion routine: create function bool(bit) returns bool as ' begin if $1 = ''1''::bit then return true; end if; return false; end;' language 'plpgsql' with (isacachable); should do the trick, albeit more slowly than a built-in or C function. -- Joel Burton <jburton@scw.org> Director of Information Systems, Support Center of Washington
On Thu, May 03, 2001 at 05:25:14PM -0400, Vivek Khera wrote: > How might one case a BIT to a BOOLEAN? For example, I want to return > rows which have non-zero bit representation for, say, (sel_a & b'0011'). > That is, rows with the first or second bit set. > > I tried an explicit CAST, and just the query directly, but the cast > say you cant cast type 'bit' to 'bool', and the direct query says > WHERE clause must return type bool, not type bit: > > create table t1 (sel_a BIT(6),sel_b BIT(6)); > insert into t1 values (b'000001',b'001000'); > select * from t1 where sel_a & b'100001'; > ERROR: WHERE clause must return type bool, not type bit > > Where might I look for this? The manual is quite sparse regarding BIT > types. > > Thanks. If you want only the rows where both bits are set then try: select * from t1 where ( sel_a & b'100001' = b'100001' ); It seems that all bit files must be equal in length.
On Thu, May 03, 2001 at 05:25:14PM -0400, Vivek Khera wrote: > How might one case a BIT to a BOOLEAN? For example, I want to return > rows which have non-zero bit representation for, say, (sel_a & b'0011'). > That is, rows with the first or second bit set. > > I tried an explicit CAST, and just the query directly, but the cast > say you cant cast type 'bit' to 'bool', and the direct query says > WHERE clause must return type bool, not type bit: > > create table t1 (sel_a BIT(6),sel_b BIT(6)); > insert into t1 values (b'000001',b'001000'); > select * from t1 where sel_a & b'100001'; > ERROR: WHERE clause must return type bool, not type bit > > Where might I look for this? The manual is quite sparse regarding BIT > types. > > Thanks. Is this what you are trying to accomplish? select * from t1 where ( sel_a & b'100001' <> b'000000' );
Robert Hentosh <hentosh@io.com> writes: > If you want only the rows where both bits are set then try: > > select * from t1 where ( sel_a & b'100001' = b'100001' ); Or for the other case, select * from t1 where ( sel_a & b'100001' != b'000000'); regards, tom lane
>>>>> "RH" == Robert Hentosh <hentosh@io.com> writes: RH> select * from t1 where (sel_a & b'100001' <> b'000000' ); Yep. That solution hit me just as the head hit the pillow last night, too! Thanks.