MySQL字符串与百分比输出的比较

时间:2011-01-31 16:44:46

标签: sql mysql string-comparison

我试图比较6个数字的两个条目,每个数字可以是0或1(即100001或011101)。如果6个中的3个匹配,我希望输出为.5。如果6个中的2个匹配,我希望输出为.33等。

以下是创建表的SQL命令

CREATE TABLE sim
(sim_key int,
 string int);

INSERT INTO sim (sim_key, string)
VALUES (1, 111000);

INSERT INTO sim (sim_key, string)
VALUES (2, 111111);

我想要的输出来比较两个字符串,它们共享50%的字符,输出50%。

是否可以在SQL中进行这种比较?提前致谢

2 个答案:

答案 0 :(得分:2)

这将返回两个字符串中等于1位的百分比:

select bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;

当您将位域存储为转换为数字的基数2表示时,我们首先需要进行转换:conv(a.string, 2, 10)conv(b.string, 2, 10)

然后我们只保留每个字段中1的位:conv(a.string, 2, 10) & conv(b.string, 2, 10)

我们统计他们:bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10))

最后我们只计算百分比:bit_count(conv(a.string, 2, 10) & conv(b.string, 2, 10)) / 6 * 100

查询返回50111000的{​​{1}}。

这是另一个版本,它也会计算匹配的零:

111111

请注意,虽然此解决方案有效,但您应该真正存储此字段:

select bit_count((conv(a.string, 2, 10) & conv(b.string, 2, 10)) | ((0xFFFFFFFF>>(32-6))&~(conv(a.string, 2, 10)|conv(b.string, 2, 10))))/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;

或者更新现有数据:

INSERT INTO sim (sim_key, string)
VALUES (1, conv("111000", 2, 10));

INSERT INTO sim (sim_key, string)
VALUES (2, conv("111111", 2, 10));

然后此查询会给出相同的结果(如果您按上述方式更新了数据):

UPDATE sim SET string=conv(string, 10, 2);

并计算零:

select bit_count(a.string & b.string)/6*100 as percent_match
from sim a, sim b where
a.sim_key=1 and b.sim_key=2;

(用你的位域大小替换select bit_count((a.string & b.string) | ((0xFFFFFFFF>>(32-6))&~(a.string|b.string)))/6*100 as percent_match from sim a, sim b where a.sim_key=1 and b.sim_key=2;

答案 1 :(得分:0)

由于您将它们存储为数字,因此可以执行此操作

SELECT BIT_COUNT(s1.string & s2.string) / BIT_COUNT(s1.string  | s1.string)
FROM sim s1, sim s2
WHERE s1.sim_key = 1 AND s2.sim_key = 2