[英]Method to find hits in comma-separated number string on SQL Server
我有一个Windows窗体(c#)应用程序和SQL Server中的一个表,该表具有两列,如下所示:
ticket (int) | numbers (string)
12345 | '01, 02, 04, 05, 09, 10, 23'
该表可能有100.000行或更多。
我要做的是找到像彩票一样的命中数量。 例如,我有12个命中,11个命中和9个命中,对于每个抽奖号码,我都必须搜索12个命中,11个命中或9个命中什么。
那么,获得这种方法的最佳方法是什么? 我需要最好的表现。
现在,我有以下代码:
string sentSQL = " SELECT ticket, numbers FROM tableA";
/* CODE TO PERFORM THE CONNECTION */
/*...*/
DbDataReader reader = connection.ExecuteReader();
int hits12, hits11, hits9 = 0;
int count;
while (reader.Read())
{
count = 0;
string numbers = reader["numbers"].ToString();
string ticketNumber = reader["ticket"].ToString();
int maxJ = balls.Count; //balls is the ArrayList with the numbers currently extracted in the raffle
for (int j = 0; j < maxJ; j++)
{
if (numbers.Contains(balls[j].ToString()))
{
count++;
}
}
switch (count)
{
case 12:
hits12++;
break;
case 11:
hits11++;
break;
case 9:
hits9++;
break;
}
}
这是可行的,但也许有更好的方法可以实现。
我正在使用SQL Server 2012,也许有功能对我有帮助吗?
编辑:我可以在SQL查询执行SUM
中的CHARINDEX
每个号码来获得SQL查询中点击量?
您目前有一个完全俗气的解决方案。
create table ticket (
ticketId int not null -- PK
)
create table TicketNumbers *
ticketId int not null,
numberSelected int not null
)
票证编号具有票证的FK,以及票证编号+已选定号码的PK。
select t.ticketId, count(*) CorrectNumbers
from ticket t
inner join TicketNumbers tn on tn.ticketId = t.TicketId
where tn.numberSelected in (9, 11, 12, 15) -- list all winning numbers
group by t.ticketId
order by count(*) desc
干杯-
一种改善此问题的简单方法是更新您的select语句,以仅获取数字大于您的第一个球号且小于最后一个球号+ 1的记录。
示例(可能是不正确的SQL):
SELECT ticket, numbers FROM tableA where '10' < numbers and '43' > numbers
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.