Обсуждение: cast bit to boolean?

Поиск
Список
Период
Сортировка

cast bit to boolean?

От
Vivek Khera
Дата:
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.

Re: cast bit to boolean?

От
Joel Burton
Дата:
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


Re: cast bit to boolean?

От
Robert Hentosh
Дата:
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.


Re: cast bit to boolean?

От
Robert Hentosh
Дата:
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' );

Re: cast bit to boolean?

От
Tom Lane
Дата:
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

Re: cast bit to boolean?

От
Vivek Khera
Дата:
>>>>> "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.