tou3921 2009-03-22 01:35
浏览 316
已采纳

关于sql中bit位的查询

postgresql:表中有个状态字段integet类型的,用于表示转换为bit(8)后的0、1状态。
例如1转换成00000001后,最后一位1表示某一个状态,0就表示没有某状态。

这8个状态分别用十进制的0,1,2,4...表示,已经在java中定义成常量了。

前台查询这个表时,传入多个状态,包含其中一个或者多个状态的数据都要查出来。

该怎么传数据、写SQL...

不知道说的清楚不?

如果前台传入一个3就是 00000011,表示把存在后两个状态其一或者全部的都查出来。但在sql里怎么进行判断呢?

后者前台不传入3而是其他结构的特定数据/?? 没想到好的办法,

传什么样的数据 ,还有SQL怎么写??? 哪位有经验的给个思路。后者给个sql。

thanks!!!
[b]问题补充:[/b]
我也试过这样开些动态sql但是,并不是所有参数都像3一样查询出1、2、3、
下面是一个列表,我没发现规律,
查询条件 符合条件的............................
1 0001 0001(1)
2 0010 0010(2)
3 0011 0001(1) 0010(2) 0011(3)
4 0100 0100(4)
5 0101 0001(1) 0100(4) 0101(5)
6 0110 0010 (2) 0100(4) 0110(6)
7 0111 0001(1) 0010(2) 0100(4) 0011(3) 0101(5) 0110(6) 0111(7)

8 1000 1000(8)
9 1001 0001(1) 1000(8) 1001(9)

直接: for(int i=1;i<=9;i++){

}

肯定是不对的。。。咋办??
[b]问题补充:[/b]
谢谢yourgame、playfish的回答。也给我思路。
playfish最后给出的结果还只是一个子集,没有组合结果。
我自己写了个方法,实验下好像没问题,但是还是感觉太麻烦,还是这东西本来就很麻烦?sql几个or下来估计很慢。。。
[code="java"]
static String returnZeros(int n){
StringBuffer bf = new StringBuffer();
for(int i=0;i<n;i++){
bf.append("0");
}
return bf.toString();
}

static List<String> getRelust(int state){
    List<String> list = new ArrayList<String>();//存放转化后的结果
    List<Integer> indexs = new ArrayList<Integer>();//存放二进制字符串转换成char[]后是1的数组下标
    String stateStr = Integer.toBinaryString(state);//将状态转换成二进制字符串
    stateStr = returnZeros(8-stateStr.length())+stateStr;//不够8位的补齐8位
    char[] stateArray = stateStr.toCharArray();
    for(int i=0;i<stateArray.length;i++){
        if(stateArray[i]=='1'){
            indexs.add(i);
        }
    }
    if (indexs.size()==1 || indexs.size()==8) {
        list.add(stateStr);
    }else{
        list.add(stateStr);
        for(int j=0;j<indexs.size();j++){
            list.add(returnZeros(indexs.get(j))+"1"+returnZeros(8-indexs.get(j)-1));
            for(int k=j+1;k<indexs.size();k++){
                list.add(returnZeros(indexs.get(j))+"1"+
                        returnZeros(indexs.get(k)-indexs.get(j)-1)+"1"+
                        returnZeros(8-indexs.get(k)-1));
            }
        }
    }
    return list;
}[/code]
  • 写回答

3条回答 默认 最新

  • playfish05 2009-03-22 14:51
    关注

    哦 ,是个10进制与2进制转换问题,这个方法在做权限控制的时候很常见.

    你可以参考下:

    [url]http://ajax.cnrui.cn/article/52/55/2006/20061116893.shtml[/url]

    只要将上面的代码做一点改变就行:

    [code="java"] public static void main(String[] args) {

        int a = 5;
        String s = Integer.toBinaryString(a);
    
        String sql = "select * from t where s="+s;
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);           
            if(c=='1'){
                int t = (int)Math.pow(2, i);
                sql += " or s="+Integer.toBinaryString(t)+" ";  
            }
        }
        System.out.println(sql);
    }[/code]
    

    虽然丑陋,不过你仔细看看就会明白其中的原理.你的规律是将10进制转换成2进制的加减,比如 9 = 2^3 + 2^0 ,原理就是这样.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程