繁体   English   中英

在SQL Server上以逗号分隔的数字字符串中找到匹配项的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM