一张规则表里的数据
====================
A    B    C    D   E
====================1    2    *    1   a
*    *    3    *   b
*    1    *    *   c其中A、B、C 、D、E为数据表字段名称,其中ABCD字段中的值表示数据,E字段的含义表示对数据的操作
1、2、*等为数据值,abc表示对数据的操作, 一行表示一条记录,即,例子中有三条记录规则如下:
* 表示任意值(包含1、2等),数字代表具体值,
怎样写sql查询输入的数据是否与一条记录相匹配举例输入的数据为
1  2  5   1    则:匹配  1  2  *  1  a
3  1  5   1    则:匹配  *  1  *  *  c当有多条记录同时匹配时,取*数量少的记录 
举例输入
1  2  3  1 同时匹配  1  2  *  1  a 和 *  *  3  *  b
则最终匹配记录为 1  2  *  1  a ,因为该记录*的数量比较少如果匹配记录的* 数量相同,则根据E字段的值进行排序,返回E字段值为c的记录举例:
输入
1 1 3 1  同时匹配 
*    *    3    *   b 和*    1    *    *   c且这两条记录*数量相同,则返回E字段值为c的记录,即*    1    *    *   c如果E字段值为c的记录有多个,则随意返回一条即可如果没有匹配,返回结果集为空即可
这样的查询SQL怎样写?要求不要用存储过程,谢谢各位老大呢!!!!
分不够可以加,谢谢!!

解决方案 »

  1.   

    select * from tablename
    where A=case when A='*' then A else 参数A end
      AND B=case when B='*' then B else 参数B end
      AND C=case when C='*' then C else 参数C end
      AND D=case when D='*' then D else 参数D end
    取*少的,不知怎么实现
      

  2.   

    select * from tablename
    where A=case when A='*' then A else 参数A end
      AND B=case when B='*' then B else 参数B end
      AND C=case when C='*' then C else 参数C end
      AND D=case when D='*' then D else 参数D end
      

  3.   

    不怕麻烦的话,取出来再判断。
    那还不如用proc
      

  4.   

    数据库Oracle.
    下面已测试正确.create table TEST
    (
      A CHAR(1),
      B CHAR(1),
      C CHAR(1),
      D CHAR(1),
      E CHAR(1)
    )-- 匹配 1 1 3 1 返回结果为 * 1 * * c,匹配 1 2 3 1 返回结果为 1  2  *  1  a SELECT A,B,C,D,E FROM
    (SELECT A,B,C,D,E FROM 
    (
    (SELECT A,B,C,D,E,DECODE(TEST.A,'*',1,0) + DECODE(TEST.B,'*',1,0) +DECODE(TEST.C,'*',1,0) + DECODE(TEST.D,'*',1,0) F
     FROM TEST 
     WHERE DECODE(TEST.A,'1','0','*','0','1') = 0 AND DECODE(TEST.B,'1','0','*','0','1') = 0
           AND DECODE(TEST.C,'3','0','*','0','1') = 0 AND DECODE(TEST.D,'1','0','*','0','1') = 0) 

    WHERE F <= (SELECT MIN(F) FROM 
     (SELECT A,B,C,D,E,DECODE(TEST.A,'*',1,0) + DECODE(TEST.B,'*',1,0) +DECODE(TEST.C,'*',1,0) + DECODE(TEST.D,'*',1,0) F
     FROM TEST 
     WHERE DECODE(TEST.A,'1','0','*','0','1') = 0 AND DECODE(TEST.B,'1','0','*','0','1') = 0
           AND DECODE(TEST.C,'3','0','*','0','1') = 0 AND DECODE(TEST.D,'1','0','*','0','1') = 0) 
    ) ORDER BY E DESC) -- 此处进行排序WHERE ROWNUM = 1;
      

  5.   

    太帅了 才发现自己以前弄得那点SQL只是玩玩。 顶~~ 学习学习
      

  6.   

    确实没用 proc 但是和用 proc 没什么区别啊只不过把 proc 里面的内容拿出来了而已~~~