簡體   English   中英

從文本字段中提取特定字符串

[英]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 並從未購買過其他任何東西 Mo​​del1 = A4665 Model2=N/AI 沒錢也不買任何東西 Mo​​del1 = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM