SQL:通过掩码从表中选择唯一的子串

时间:2014-12-16 09:39:51

标签: mysql sql sql-server select

有一个SQL表mytable,其中包含mycolumn列。 该列在每个单元格中都有文本。每个单元格可能包含" this.text / 31 /"或" this.text / 72 /" 子串(该子串中的数字可以是任意数字)作为字符串的一部分。

应该执行哪些SQL查询来显示唯一的此类子字符串列表?

P.S。当然,一些单元可能包含几个这样的子串。

以下是评论中提问的答案: 该查询应该适用于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/

4 个答案:

答案 0 :(得分:1)

使用以下数据创建名为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/

缺点是你需要为你可能拥有的每一次出现添加一个select语句" this.text"。如果你有100" this.text"在同一个单元格中,这可能是一个问题。

答案 1 :(得分:1)

如何使用递归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

答案 2 :(得分:0)

SQL>从tablename中选择SUBSTR(column_name,1,9);

列名


this.text

答案 3 :(得分:0)

SELECT REGEXP_SUBSTR(column_name,'this.text/[[:digit:]]+/') 
FROM table_name