簡體   English   中英

SQL:按掩碼從表中選擇唯一的子字符串

[英]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.

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