按空格和“-”分割字符串 SQL Server

时间:2021-07-29 15:20:07

标签: sql sql-server split

我有以下列值:

test-00 - test-01 - test-02

我需要获取'-'和'-'之间的字符串

test-01

是否可以在 SQL Server 中使用?

我试过:

STRING_SPLIT(column, ' -')

但它只适用于 '-' 不适用于 ' -'

5 个答案:

答案 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
)

参考这个问题https://stackoverflow.com/a/17597049/2429434

答案 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)