在SQL Server上以逗号分隔的数字字符串查找命中的方法

时间:2014-02-04 19:04:02

标签: c# sql sql-server sql-server-2012

我有一个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的{​​{1}}来获取sql查询中的点击量吗?

2 个答案:

答案 0 :(得分:0)

你目前有一个非常俗气的解决方案。

create table ticket (
    ticketId int not null -- PK
)
create table TicketNumbers *
    ticketId int not null,
    numberSelected int not null
)

TicketNumbers有一个FK到Ticket,一个PK为TicketNumber + numberSelected。

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

干杯 -

答案 1 :(得分:-1)

改善这种情况的一种简单方法是更新您的select语句,以便只获取数字大于第一个球数的记录,而不是最后一个球数+ 1 ...

示例(可能不正确的SQL):

SELECT ticket, numbers FROM tableA where '10' < numbers and '43' > numbers