我使用這個網站的時間比我記得的要長,但我以前從來沒有問過問題——我一直都能找到我需要的東西——但是這個可以使用一些 SQL 專業知識來獲得最佳方法因為這是最壞的情況。
我有一個文本注釋欄位,其中包含很多格式不一致的內容 - 它將包括患者姓名,希望是記錄 ID(可能來自按范圍區分的 2 個不同表)、空格、斜杠、電話號碼、輸入者的姓名首字母等。我將擦洗一些示例...我需要在此處找到數字 RecordID(它參考另一個斷開連接的系統)并忽略其余部分。極有可能它可能有 2 個記錄號(可以在兩個不同的表中參考) - 如果是這樣,我需要選擇更重要的一個。
示例資料(已清理):
Sanchez,Raul - POS - OS - 489-849-7894 - AB - Conf >> 此處沒有任何價值/回傳 NULL
Smith,Nancy RL 1458968-rl >> 回傳 1458968
Sudhu,Mandeep 攝入量 # 78596/ rl >> 回傳 78596
1887569 Smith, Jonathan-ESK >> 回傳 1021015
Montana, Joe/1451252rm >> 回傳 1451252
Johnson, Fredy/1784569/78563/RG >> 回傳 1784569
我的第一個想法是做一堆嵌套的 Replace() 函式來將任何不是字符的東西變成標準分隔符,用 split_string() 將這些全部決議為單獨的記錄,然后只選擇最大的數字 - 這將適用于每個除了上面的#5之外的例子......但這是最好的方法,還是有更好的方法?SQL 版本為 2017 以供參考可用功能。
這將被包裝成一個標量值函式。
謝謝!
uj5u.com熱心網友回復:
這是一種提取所有數字的方法。
t1 識別每個文本中的所有非數字字符。
t2 用空格替換所有非數字字符。
t3 假設數字可能被未知數量的空格分隔,并用單個空格替換每個空格序列。
享受 :-)
with
t1
as
(
select record_id
,txt
,translate(txt, '1234567890', space(10)) as non_digits
from t
),
t2
as
(
select record_id
,trim(translate(txt, non_digits, space(len(non_digits)))) as spaced_numberes
from t1
),
t3
as
(
select record_id
,replace(replace(replace(spaced_numberes, ' ', ' *'), '* ', ''), '*', '') as space_delimited_numbers
from t2
)
select t3.record_id
,ss.value
from t3
cross apply string_split(space_delimited_numbers, ' ') as ss
| 記錄ID | 價值 |
|---|---|
| 1 | 489 |
| 1 | 849 |
| 1 | 7894 |
| 2 | 1458968 |
| 3 | 78596 |
| 4 | 1887569 |
| 5 | 1451252 |
| 6 | 1784569 |
| 6 | 78563 |
| 7 | 336464564 |
| 7 | 77667 |
| 7 | 45676876876 |
小提琴
uj5u.com熱心網友回復:
一種選擇是使用一些 MS SQL 模式匹配來提取第一個數字:
- 檢測第一個數字的第一個數字的位置,使用
PATINDEX - 檢測第一個數字的最后一位數字的位置,使用
PATINDEX - 使用提取數字
SUBSTRING
SELECT string,
SUBSTRING(string,
PATINDEX('%[0-9]%' , string),
1 PATINDEX('%[0-9][^0-9]%', string)-PATINDEX('%[0-9]%',string))
FROM tab
一旦你有了這個,你可以對這些數字做一些交叉檢查。
在此處查看演示。
注意:此解決方案假定您感興趣的值(如果有)是作為第一個數字找到的,條件可調整,給定值的域可以使用更好的模式匹配。
對你的案子有幫助嗎?
uj5u.com熱心網友回復:
我太新了,無法投票 - 這很有趣!不知道如何確保我給予適當的信任,并且仍然對進一步的批評持開放態度,所以如果我需要做點什么,請告訴我......
無論如何,我接受了大衛的建議并將其變成了這樣:
DECLARE @String as varchar(255)
SET @String = 'Montana, Joe/14510252rm/8456,71253|'
;
WITH cte1 AS
(
SELECT * FROM (SELECT @String AS String) T
)
, cte2 AS
(
SELECT String, translate(string, '1234567890', space(10)) AS non_digits
FROM cte1
)
, cte3 AS
(
SELECT string, non_digits
,trim(translate(String, non_digits, space(len(non_digits)))) as spaced_numbers
FROM cte2
)
, cte4 AS
(
SELECT string, replace(replace(replace(spaced_numbers, ' ', ' *'), '* ', ''), '*', '') as space_delimited_numbers
FROM cte3
)
, cte5 AS
(
SELECT string , cast(ss.value as int) result
FROM cte4
CROSS APPLY string_split(space_delimited_numbers,' ') as ss
)
SELECT TOP 1 result
FROM cte5
WHERE (result between 1000000 AND 2000000) OR (result between 70000 AND 199999) ORDER BY result DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491570.html
