簡體   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