Mysql SQL:按掩码从表中选择唯一的子字符串

Mysql SQL:按掩码从表中选择唯一的子字符串,mysql,sql,sql-server,select,Mysql,Sql,Sql Server,Select,有一个SQL表mytable,它有一个列mycolumn。 该列的每个单元格中都有文本。每个单元格都可以包含“this.text/31/”或“this.text/72/”子字符串(该子字符串中的数字可以是任意的)作为字符串的一部分 应该执行什么SQL查询来显示此类子字符串的唯一列表 当然,有些单元格可能包含几个这样的子字符串 以下是评论中问题的答案: 该查询应该在SQL Server上工作。 首选输出应包含整个子字符串,而不仅仅是数字部分。它实际上可能不仅仅是第一个“/”和第二个“/”之间的数字

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

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

当然,有些单元格可能包含几个这样的子字符串

以下是评论中问题的答案: 该查询应该在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/
SQL>从tablename中选择SUBSTR(列名称,1,9)

列名



此.text包含一个名为test的表,其中包含以下数据:

COLUMN1
aathis.text/31/
this.text/1/
bbbthis.text/72/sksk
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 ),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/

我明白你的问题:

假设与上述表格相同,但现在有以下数据:

COLUMN1
aathis.text/31/
this.text/1/
bbbthis.text/72/sksk
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如何:

SELECT REGEXP_SUBSTR(column_name,'this.text/[[:digit:]]+/') 
FROM table_name
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

所以你只想要数字部分?您能否根据示例数据集澄清所需的输出?因此,此单元格是
varchar
类型?您的查询是否应该同时在MySQL和SQL Server上工作?为什么
不从mytable
工作中选择不同的mycolumn?我将您的问题的答案放在上面的描述中。非常感谢。