[英]SQL: select unique substrings from the table by mask
有一個SQL表mytable
,該表具有一列mycolumn
。 該列在每個單元格內都有文本。 每個單元格可能包含“ this.text / 31 /”或“ this.text / 72 /” 子字符串 (該子字符串中的數字可以是任意)作為字符串的一部分。
應該執行哪個SQL查詢以顯示唯一的此類子字符串列表?
PS當然,某些單元格可能包含多個此類子字符串。
以下是對注釋提出的問題的答案:應該在SQL Server上運行的查詢。 首選輸出應包含整個子字符串,而不僅僅是數字部分。 實際上,它可能不僅僅是第一個“ /”和第二個“ /”之間的數字。
而且是varchar類型(可能)
示例: mycolumn
包含以下值:
abcd/eftthis.text/31/sadflh adslkjh
abcd/eftthis.text/44/khjgb ljgnkhj this.text/447/lhkjgnkjh
ljgkhjgadsvlkgnl
uygouyg/this.text/31/luinluinlugnthis.text/31/ouygnouyg
khjgbkjyghbk
查詢應顯示:
this.text/31/
this.text/44/
this.text/447/
有一個名為test的表,其中包含以下數據:
COLUMN1
aathis.text/31/
this.text/1/
bbbthis.text/72/sksk
這可能是您想要的嗎?
select SUBSTR(COLUMN1,INSTR(COLUMN1,'this.text', 1 ),INSTR(COLUMN1,'/',INSTR(COLUMN1,'this.text', 1 )+10) - INSTR(COLUMN1,'this.text', 1 )+1) from test;
結果:
this.text/31/
this.text/1/
this.text/72/
我看到你的問題了:
假定與上面相同的表,但現在具有以下數據:
this.text/77/
xxthis.text/33/xx
xthis.text/11/xxthis.text/22/x
xthis.text/1/x
以下內容可能對您有幫助:
SELECT SUBSTR(COLUMN1, INSTR(COLUMN1,'this.text', 1 ,1), INSTR(COLUMN1,'/',INSTR(COLUMN1,'this.text', 1 ,1)+10) - INSTR(COLUMN1,'this.text', 1 ,1)+1) FROM TEST
UNION
SELECT CASE WHEN (INSTR(COLUMN1,'this.text', 1,2 ) >0) THEN
SUBSTR(COLUMN1, INSTR(COLUMN1,'this.text', 1,2 ), INSTR(COLUMN1,'/',INSTR(COLUMN1,'this.text', 1 ,2),2) - INSTR(COLUMN1,'this.text', 1,2 )+1) end FROM TEST;
它將產生以下結果:
this.text/1/
this.text/11/
this.text/22/
this.text/33/
this.text/77/
缺點是您需要為“ this.text”的每次出現添加一個select語句。 如果在同一單元格中可能有100個“ this.text”,則可能是一個問題。
如何使用遞歸CTE:
CREATE TABLE #myTable
(
myColumn VARCHAR(100)
)
INSERT INTO #myTable
VALUES
('abcd/eftthis.text/31/sadflh adslkjh'),
('abcd/eftthis.text/44/khjgb ljgnkhj this.text/447/lhkjgnkjh'),
('ljgkhjgadsvlkgnl'),
('uygouyg/this.text/31/luinluinlugnthis.text/31/ouygnouyg'),
('khjgbkjyghbk')
;WITH CTE
AS
(
SELECT MyColumn,
CHARINDEX('this.text/', myColumn, 0) AS startPos,
CHARINDEX('/', myColumn, CHARINDEX('this.text/', myColumn, 1) + 10) AS endPos
FROM #myTable
WHERE myColumn LIKE '%this.text/%'
UNION ALL
SELECT T1.MyColumn,
CHARINDEX('this.text/', T1.myColumn, C.endPos) AS startPos,
CHARINDEX('/', T1.myColumn, CHARINDEX('this.text/', T1.myColumn, c.endPos) + 10) AS endPos
FROM #myTable T1
INNER JOIN CTE C
ON C.myColumn = T1.myColumn
WHERE SUBSTRING(T1.MyColumn, C.EndPos, 100) LIKE '%this.text/%'
)
SELECT DISTINCT SUBSTRING(myColumn, startPos, EndPos - startPos)
FROM CTE
SQL>從表名中選擇SUBSTR(column_name,1,9);
column_name
此文本
SELECT REGEXP_SUBSTR(column_name,'this.text/[[:digit:]]+/')
FROM table_name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.