有一个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/
答案 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