我有以下列值:
test-00 - test-01 - test-02
我需要获取'-'和'-'之间的字符串
test-01
是否可以在 SQL Server 中使用?
我试过:
STRING_SPLIT(column, ' -')
但它只适用于 '-'
不适用于 ' -'
答案 0 :(得分:3)
您可以使用 replace()
来制作单字符分隔符:
string_split(replace(column, ' - ', '|'), '|')
我猜你理解其余的逻辑,因为你提到在你的问题中以这种方式拆分字符串。
答案 1 :(得分:3)
请尝试以下解决方案。
SQL
-- DDL and data population, start
DECLARE @tbl Table (ID INT IDENTITY PRIMARY KEY, Tokens VARCHAR(MAX));
INSERT INTO @tbl (Tokens) VALUES
('test-00 - test-01 - test-02'),
('test-03 - test-04 - test-05');
-- DDL and data population, end
SELECT ID, Tokens
, PARSENAME(c, 2) as [token-in-between]
FROM @tbl
CROSS APPLY (VALUES (REPLACE(Tokens, ' - ','.'))) AS t(c);
输出
+----+-----------------------------+------------------+
| ID | Tokens | token-in-between |
+----+-----------------------------+------------------+
| 1 | test-00 - test-01 - test-02 | test-01 |
| 2 | test-03 - test-04 - test-05 | test-04 |
+----+-----------------------------+------------------+
答案 2 :(得分:0)
您可以尝试以下操作:
WITH cte AS(
SELECT 'test-00 - test-01 - test-02' AS x
UNION ALL
SELECT 'test-03 - test-04 - test-05'
),
cteRn AS(
SELECT *, ROW_NUMBER() OVER (ORDER BY x) rn
FROM cte
),
cteSplit AS(
SELECT rn, ROW_NUMBER() OVER(PARTITION BY rn ORDER BY value) rnFilter, TRIM(value) AS value
FROM cteRn
OUTER APPLY STRING_SPLIT(REPLACE(REPLACE(x, ' -', '|'), '- ', '|'), '|')
)
SELECT value
FROM cteSplit
WHERE rnFilter = 2
但是,这仅在您确实想用“-”和“-”分割时才有效。
答案 3 :(得分:0)
您可以使用以下查询:
SELECT REGEXP_SUBSTR(str, '[ - ]+', 1, NULL) AS substr
FROM (
SELECT COLUMN_NAME AS str FROM DUAL
)
答案 4 :(得分:0)
这是另一种方法
--==== Some test data
Declare @testData Table (TestData varchar(100));
Insert Into @testData (TestData)
Values ('test-00 - test-01 - test-02')
, ('test-03 - test-04 - test-05');
Select col1 = substring(v.TestData, 1, p1.pos - 2)
, col2 = substring(v.TestData, p1.pos, p2.pos - p1.pos - 1)
, col3 = substring(v.TestData, p2.pos, p3.pos - p2.pos - 1)
From @testData As td
Cross Apply (Values (concat(replace(td.TestData, ' - ', '|'), '|||'))) As v(TestData)
Cross Apply (Values (charindex('|', v.TestData, 1) + 1)) As p1(pos)
Cross Apply (Values (charindex('|', v.TestData, p1.pos) + 1)) As p2(pos)
Cross Apply (Values (charindex('|', v.TestData, p2.pos) + 1)) As p3(pos)