一张规则表里的数据
====================
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怎样写?要求不要用存储过程,谢谢各位老大呢!!!!
分不够可以加,谢谢!!
====================
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怎样写?要求不要用存储过程,谢谢各位老大呢!!!!
分不够可以加,谢谢!!
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
取*少的,不知怎么实现
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
那还不如用proc
下面已测试正确.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;