Mysql SQL:按掩码从表中选择唯一的子字符串
有一个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上工作。 首选输出应包含整个子字符串,而不仅仅是数字部分。它实际上可能不仅仅是第一个“/”和第二个“/”之间的数字
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?我将您的问题的答案放在上面的描述中。非常感谢。