Thread: bit operations

bit operations

From
"Johan Björk"
Date:
I'm new to PostgreSQL, and I'm trying to migrate a MySQL-implementation to this instead... It's really different from
MySQL,and the docs are not as good, and the IRC-channel (on EFNet at least) is really really inactive. But still. :-)
Maybethe mailinglist is more impressive... 

Have a little problem with bit operaitions that I cannot find the answer to on the Internet. Have been searching
throughthe archives but no result. 

In MySQL you can have a INT column and do bit logic ala C-style like this:
"select * from table where flags & 4;"

Can I do something similar with std SQL? I've been trying to cast everything to BIT but without success, and I've also
beencreating a "flags bit(4)", setting a row to "1000" (8) and trying to compare, but I have absolutely no idea how to. 

Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!

Please help me! :-)

---
Johan Björk



Re: bit operations

From
Oliver Vecernik
Date:
Johan Björk wrote:
>
> I'm new to PostgreSQL, and I'm trying to migrate a MySQL-implementation to this instead... It's really different from
MySQL,and the docs are not as good, and the IRC-channel (on EFNet at least) is really really inactive. But still. :-)
Maybethe mailinglist is more impressive... 
>
> Have a little problem with bit operaitions that I cannot find the answer to on the Internet. Have been searching
throughthe archives but no result. 
>
> In MySQL you can have a INT column and do bit logic ala C-style like this:
> "select * from table where flags & 4;"
>
> Can I do something similar with std SQL? I've been trying to cast everything to BIT but without success, and I've
alsobeen creating a "flags bit(4)", setting a row to "1000" (8) and trying to compare, but I have absolutely no idea
howto. 
>
> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!

select * from table where (flags & 8) <> 0;
select * from table where (flags & 2) <> 0;

Regards,
Oliver

Re: bit operations

From
Oliver Vecernik
Date:
Johan Björk wrote:
>
> I'm new to PostgreSQL, and I'm trying to migrate a MySQL-implementation to this instead... It's really different from
MySQL,and the docs are not as good, and the IRC-channel (on EFNet at least) is really really inactive. But still. :-)
Maybethe mailinglist is more impressive... 
>
> Have a little problem with bit operaitions that I cannot find the answer to on the Internet. Have been searching
throughthe archives but no result. 
>
> In MySQL you can have a INT column and do bit logic ala C-style like this:
> "select * from table where flags & 4;"

But in PostgreSQL WHERE clause must return type bool, not type int4

>
> Can I do something similar with std SQL? I've been trying to cast everything to BIT but without success, and I've
alsobeen creating a "flags bit(4)", setting a row to "1000" (8) and trying to compare, but I have absolutely no idea
howto. 
>
> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!

Sorry, I didn't read the whole question first:

select * from table where ((flags & 8) <> 0) and ((flags & 2) <> 0);

Regards,
Oliver

Re: bit operations

From
"Richard Huxton"
Date:
From: "Johan Björk" <johan@websidorna.com>

> Have a little problem with bit operaitions that I cannot find the answer
to on the Internet. Have been searching through the archives but no result.
>
> In MySQL you can have a INT column and do bit logic ala C-style like this:
> "select * from table where flags & 4;"

If you're using an int for "flags":

select * from table where (flags & 4) > 0;

The bitwise AND returns an integer rather than a boolean, and AFAIK SQL
doesn't follow C's rules on this.

> Can I do something similar with std SQL? I've been trying to cast
everything to BIT but without success, and I've also been creating a "flags
bit(4)", setting a row to "1000" (8) and trying to compare, but I have
absolutely no idea how to.
>
> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!

To check two values just do:

  SELECT * FROM table WHERE (flags & val1 & val2) > 0;


If you want to use BIT types you'll need something like:

  SELECT * FROM table WHERE (flags & '0010100'::BIT) <> '0'::BIT;

and updates like

  UPDATE table SET flags = flags | '0001000'::BIT;

Note the need to have the same string-length when using AND/OR.

HTH

- Richard Huxton


Re: bit operations

From
merlyn@stonehenge.com (Randal L. Schwartz)
Date:
>>>>> "Oliver" == Oliver Vecernik <vecernik@aon.at> writes:

>> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!

Oliver> Sorry, I didn't read the whole question first:

Oliver> select * from table where ((flags & 8) <> 0) and ((flags & 2) <> 0);

In the old days, we spelled that as flags & 10 = 10. :)  Wouldn't that
work just as well?

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

Re: bit operations

From
Oliver Vecernik
Date:
"Randal L. Schwartz" wrote:
>
> >>>>> "Oliver" == Oliver Vecernik <vecernik@aon.at> writes:
>
> >> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!
>
> Oliver> Sorry, I didn't read the whole question first:
>
> Oliver> select * from table where ((flags & 8) <> 0) and ((flags & 2) <> 0);
>
> In the old days, we spelled that as flags & 10 = 10. :)  Wouldn't that
> work just as well?

As far as I know testing for <> 0 could be calculated faster. Does
anybody know if this is true?

Regards,
Oliver

Re: bit operations

From
merlyn@stonehenge.com (Randal L. Schwartz)
Date:
>>>>> "Oliver" == Oliver Vecernik <vecernik@aon.at> writes:

Oliver> "Randal L. Schwartz" wrote:
>>
>> >>>>> "Oliver" == Oliver Vecernik <vecernik@aon.at> writes:
>>
>> >> Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!
>>
Oliver> Sorry, I didn't read the whole question first:
>>
Oliver> select * from table where ((flags & 8) <> 0) and ((flags & 2) <> 0);
>>
>> In the old days, we spelled that as flags & 10 = 10. :)  Wouldn't that
>> work just as well?

Oliver> As far as I know testing for <> 0 could be calculated faster. Does
Oliver> anybody know if this is true?

But that's wrong for flags & 10.
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

Re: bit operations

From
will trillich
Date:
On Wed, Jul 04, 2001 at 02:56:06PM +0100, Richard Huxton wrote:
> From: "Johan Björk" <johan@websidorna.com>
>
> > Have a little problem with bit operaitions that I cannot find the answer
> to on the Internet. Have been searching through the archives but no result.
> >
> > In MySQL you can have a INT column and do bit logic ala C-style like this:
> > "select * from table where flags & 4;"
>
> If you're using an int for "flags":
>
> select * from table where (flags & 4) > 0;
>
> The bitwise AND returns an integer rather than a boolean, and AFAIK SQL
> doesn't follow C's rules on this.
>
> > Can I do something similar with std SQL? I've been trying to cast
> everything to BIT but without success, and I've also been creating a "flags
> bit(4)", setting a row to "1000" (8) and trying to compare, but I have
> absolutely no idea how to.
> >
> > Say I wanna check if 8 (1xxx) and 2 (xx1x) is set, how do I do that?!
>
> To check two values just do:
>
>   SELECT * FROM table WHERE (flags & val1 & val2) > 0;

i don't think so.

    val1 := 8 := 01000
    val2 := 2 := 00010
    val1 & val2  00000 zero

probably you meant

    (flags & val1) > 0 and (flags & val2) > 0
or
    flags & (val1 + val2) > 0

> If you want to use BIT types you'll need something like:
>
>   SELECT * FROM table WHERE (flags & '0010100'::BIT) <> '0'::BIT;
>
> and updates like
>
>   UPDATE table SET flags = flags | '0001000'::BIT;
>
> Note the need to have the same string-length when using AND/OR.

cool. thanks.

--
I'd concentrate on "living in the now" because it is fun
and on building a better world because it is possible.
    - Tod Steward

will@serensoft.com
http://sourceforge.net/projects/newbiedoc -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!