[英]Extracting specific strings from text field
我在 SQL Server 數據庫中工作。 我有一個帶有 5 個字符的字母數字字段的表格,該字段始終為 5 個字符。 它將始終為 5 個字符,永遠不會有特殊字符。 該表大約有 100K 行。
我有另一個帶有字符串字段的表,可能包含也可能不包含這些字符。 該表目前大約有 2500 種可能的格式。 但是這些都可以添加和修改。 不幸的是,我無法訪問用於確定該領域應該有什么的數據。
表1.型號
A1234
B1234
A6485
16849
A4665
99999
Table2.StringField
I have purchased model number A1234 after returning B6485
I have purchased model number 16849 after we thought about 99999
I have purchased model number B1234 before also looking at A1234
I returned A4665 and never purchased anything else
I have no money and don’t buy anything
我想從這些中提取型號。 我目前正在使用一個 case 語句,它基本上可以解釋 20 種可能的格式。 當我發現可能出現在我的數據中的新場景時,我會添加到 case 語句中。
偽代碼:
Case when stringfield like 'I have purchased model number%return%'
Then substring(stringfield,30,5) as Model1 and substring(stringfield,52,5) as Model2
When stringfield like 'I have purchased model number%'
Then substring(stringfield,30,5) as Model1 and substring(stringfield,59,5) as Model2
When stringfield like 'I returned%'
Then substring(stringfield,11,5) as Model1 and 'N/A' as Model2
Else 'N/A' as Model1 and 'N/A' as Model2
END
預期結果:我退貨后購買了型號A1234 B6485 Model1 = A1234 Model2=B6485 考慮了99999 Model1 = 16849 Model2=99999 購買了型號16849 之前也購買了型號B1234 Model1 = B6485 B1234 Model1 = B6485 =A1234
我退回了 A4665 並從未購買過其他任何東西 Model1 = A4665 Model2=N/AI 沒錢也不買任何東西 Model1 = N/A Model2=N/A
我將各種場景放入參考表中,以便我可以根據需要進行更新。
有一個更好的方法嗎? 這不是一個大問題,只是不斷的東西,然后進行更新的眼睛是必要的。 但這只是我需要維護的事項清單中的一項。
提前致謝。
我忘記提及的一件事是,有時該字段的另一個子字符串類似於 A14351835410571982 - 我不想要該字符串中的任何內容。
我想嘗試的事情是:
從 Table1 到自身交叉連接,然后說 If stringfield like '%value1%value2%' then value1 and value2。 但那是 100k x 100k 組合,看起來大得令人望而卻步。
在 stringfield 中搜索任何長度為 5 個字符后跟一個空格或句點或逗號的任何內容,這些內容要么是全數字,要么是單個字母和 4 個數字,然后以某種方式按順序獲取第一個字符串和第二個字符串。
前兩者的組合:識別所有記錄中的所有 5 個字符串,然后將它們交叉連接並與通配符匹配。 這可能是大約 20k 個值而不是 100k
繼續沿着我目前走的路走下去,只用蠻力去做
** 注意:我是一名報告分析師,而不是一名開發人員,所以我知道足夠多的 SQL 是危險的。 我通常可以遵循最高復雜度的 SQL,但可能需要任何其他方面的幫助。
這里有一個示例,說明 string_split 和 cross apply 的組合如何從字符串中獲取模型。
declare @Test table (id int identity(1,1) primary key, stringfield varchar(max)); insert into @Test (stringfield) values ('I have purchased model number A1234 after returning B6485') , ('I have purchased model number 16849 after we thought about 99999') , ('I have purchased model number B1234 before also looking at A1234') , ('I returned A4665 and never purchased anything') , ('I have no money and don't buy anything') ; select t.id, a.model from @Test t cross apply (select value as model from string_split(stringfield, ' ') spl where value COLLATE Latin1_General_BIN like '[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]' ) a GO
\n身份證 | 模型\n -: | :----\n 1 | A1234\n 1 | B6485\n 2 | 16849\n 2 | 99999\n 3 | B1234\n 3 | A1234\n 4 | A4665\n
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.