我想用單個*值替換 SQL 中的所有數字。我已經研究了這個問題,但無法復制我發現的內容。我也覺得我把這個程序復雜化了。以下是我目前正在做的事情的分解:
創建臨時表用*替換數字。
這是我需要幫助的部分。我需要用一個
*.最后一步是查詢我的資料并對我的資料進行分組。
詢問:
CREATE TABLE #CMS_ERROR_LOG
(
ERROR_LOG_BODY NVARCHAR(MAX),
);
INSErT INTO #CMS_ERROR_LOG
select REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE ([ERROR_LOG_BODY], '0', '*'),
'1', '*'),
'2', '*'),
'3', '*'),
'4', '*'),
'5', '*'),
'6', '*'),
'7', '*'),
'8', '*'),
'9', '*')
FROM CMS_ERROR_LOG
WHERE ERROR_LOG_MESSAGE = 'API Request Capture'
SELECT
SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2) AS 'Request'
FROM #CMS_ERROR_LOG
GROUP BY SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2)
我讀了一些關于#在替換陳述句中使用僅用單個字符替換但無法使其作業的內容。
當前結果:[POST] URL:https://localhost:*****/api/authentication/authenticat
預期結果:[POST] URL:https://localhost:*/api/authentication/authenticat
更新:我已經能夠將資料格式化為更接近我需要的格式:
--DROP TABLE #CMS_ERROR_LOG
CREATE TABLE #CMS_ERROR_LOG
(
ERROR_LOG_BODY NVARCHAR(MAX),
);
INSErT INTO #CMS_ERROR_LOG
select
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], '0', '*'),'1', '*'),'2', '*'),'3', '*'),'4', '*'),'5', '*'),'6', '*'),'7', '*'),'8', '*'),'9', '*')
FROM CMS_ERROR_LOG
WHERE ERROR_LOG_MESSAGE = 'API Request Capture'
--CLEAN UP
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], '**', '*'),'***', '*'),'****', '*'),'*****', '*'),'******', '*'),'*******', '*'),'********', '*'),'*********', '*')
FROM #CMS_ERROR_LOG
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], 'cases/*******', 'cases/*'),'contacts/******', 'contacts/*'),'LoanNumber=**********', 'LoanNumber=*'),'CourtCaseNumber=**', 'CourtCaseNumber=*'),'PropertyAddress=****', 'PropertyAddress=*'),'cases/**', 'cases/*'),'********', '*'),'*********', '*')
FROM #CMS_ERROR_LOG
SELECT
SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2) AS 'Request'
FROM #CMS_ERROR_LOG
GROUP BY SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2)
DROP TABLE #CMS_ERROR_LOG
問題是,它仍然沒有正確清理所有字串:例如,我最終得到了這樣的結果:
[GET] URL:https://masked.../masked.../api/cases/*****/contacts/*
[GET] 網址:https://masked.../masked.../api/casefiles/******/loanRecords
更新:我已經更新了我的 SQL。我能夠解決我的問題。現在只是試圖清理未編輯的資料。很高興有更好的方法來替換。但是,我使用的是 2012 版,不能選擇 TRANSLATE。
新查詢:
--DROP TABLE #CMS_ERROR_LOG
CREATE TABLE #CMS_ERROR_LOG
(
ERROR_LOG_BODY NVARCHAR(MAX),
);
INSErT INTO #CMS_ERROR_LOG
select
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], '0', ''),'1', ''),'2', ''),'3', ''),'4', ''),'5', ''),'6', ''),'7', ''),'8', ''),'9', '')
FROM CMS_ERROR_LOG
WHERE ERROR_LOG_MESSAGE = 'API Request Capture'
--CLEAN UP
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE
([ERROR_LOG_BODY], '//', '/*/')
FROM #CMS_ERROR_LOG
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], 'https:/*/', 'https://'),'=&', '=*&'),'OfficeCode=NJ', 'OfficeCode=*'),'OfficeCode=VA', 'OfficeCode=*'),'OfficeCode=NY', 'OfficeCode=*')
FROM #CMS_ERROR_LOG
--Office Codes
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], 'OfficeCode=NJ', 'OfficeCode=*'),'OfficeCode=VA', 'OfficeCode=*'),'OfficeCode=NY', 'OfficeCode=*'),'OfficeCode=FL', 'OfficeCode=*')
FROM #CMS_ERROR_LOG
INSERT INTO #CMS_ERROR_LOG
SELECT
REPLACE(REPLACE(REPLACE(REPLACE
([ERROR_LOG_BODY], 'officeCode=NJ', 'OfficeCode=*'),'officeCode=VA', 'OfficeCode=*'),'officeCode=NY', 'OfficeCode=*'),'officeCode=FL', 'OfficeCode=*')
FROM #CMS_ERROR_LOG
SELECT
SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2) AS 'Request'
FROM #CMS_ERROR_LOG
GROUP BY SUBSTRING([ERROR_LOG_BODY],1,CHARINDEX(',', [ERROR_LOG_BODY])-2)
DROP TABLE #CMS_ERROR_LOG
uj5u.com熱心網友回復:
如果您使用的是 SQL Server 2017 ,那么您有我們的好朋友TRANSLATE。否則嵌套REPLACE就可以了。在這些示例中,我使用 NEWID 填充帶有數字的隨機文本的表,然后使用這兩種技術回傳您想要的內容。(注意可重現的樣本資料):
--==== 1. Re-producable Sample Data
DECLARE @t TABLE (SampleTxt VARCHAR(36));
INSERT @t SELECT TOP(10) NEWID() FROM sys.all_columns;
--==== 2. Solution #1: TRANSLATE
SELECT
Original = t.SampleTxt,
Cleaned = REPLACE(REPLACE(REPLACE(REPLACE(TRANSLATE(t.SampleTxt,'1234567890',
'**********'),'********','*'),'****','*'),'**','*'),'**','*')
FROM @t AS t;
--==== 3. Solution #2: Nested Replace for Number replacement
SELECT
Original = t.SampleTxt,
Cleaned = Transform2.Txt
FROM @t AS t
CROSS APPLY(VALUES(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE (t.SampleTxt,'0','*'),'1','*'),'2','*'),'3','*'),
'4', '*'),'5', '*'),'6','*'),'7','*'),'8','*'),'9','*'))
) AS Transform1(Txt)
CROSS APPLY (VALUES(REPLACE(REPLACE(REPLACE(REPLACE(Transform1.Txt,
'********','*'),'****','*'),'**','*'),'**','*'))) AS Transform2(Txt);
兩者都回傳:
Original Cleaned
-------------------------------------- ------------------------------------
EF73E87F-868D-49E4-A347-CA42D5A378C0 EF*E*F-*D-*E*-A*-CA*D*A*C*
092CDE6E-C844-416A-B2DC-ACA948A38991 *CDE*E-C*-*A-B*DC-ACA*A*
D157AF76-35C0-401A-9CCC-5AC3F522A91B D*AF*-*C*-*A-*CCC-*AC*F*A*B
00A0BD46-3A97-452E-806D-D5272C0BDF1C *A*BD*-*A*-*E-*D-D*C*BDF*C
837B469C-7453-4B77-894B-9AEEDFFEF543 *B*C-*-*B*-*B-*AEEDFFEF*
9C92AE57-4AF5-4E82-A3C2-6D94DF9E3C3F *C*AE*-*AF*-*E*-A*C*-*D*DF*E*C*F
58D8D873-D9E0-4582-867B-16810F10BD42 *D*D*-D*E*-*-*B-*F*BD*
7F80B552-C1D6-4A97-9C51-6FB8491D26B6 *F*B*-C*D*-*A*-*C*-*FB*D*B*
C466CADC-E38F-43A2-AA8F-CB0BDB0069DB C*CADC-E*F-*A*-AA*F-CB*BDB*DB
1A5D6EC0-8335-485C-927F-D36E019EA6E1 *A*D*EC*-*-*C-*F-D*E*EA*E*
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460703.html
上一篇:檢查范圍之間的日期是否可用
