在sql server行中插入列值
我在-'上拆分'0021C-15563017-2'和' 我想在T2中插入(在sql server行中插入列值,sql,sql-server,transpose,Sql,Sql Server,Transpose,我在-'上拆分'0021C-15563017-2'和' 我想在T2中插入(0021c,15563017,2),请参见图。 我尝试了交叉应用,在表(img2)的一行中插入分割值,但没有起作用 我使用的查询: SELECT CLNTCODE, certno, depcode FROM T2 CROSS APPLY STRING_SPLIT('0021C-15563017-2', '-'); 我建议不要在这里使用STRING\u SPLIT,因为可能很难从连字符分隔的字符串中找出三个组件。相
0021c
,15563017
,2
),请参见图。
我尝试了交叉应用,在表(img2)的一行中插入分割值,但没有起作用
我使用的查询:
SELECT CLNTCODE, certno, depcode
FROM T2
CROSS APPLY STRING_SPLIT('0021C-15563017-2', '-');
我建议不要在这里使用
STRING\u SPLIT
,因为可能很难从连字符分隔的字符串中找出三个组件。相反,我建议使用CHARINDEX
:
WITH T2 AS (
SELECT '0021C-15563017-2' AS col
)
SELECT
LEFT(col, CHARINDEX('-', col) - 1) AS CLNTCODE,
SUBSTRING(col,
CHARINDEX('-', col) + 1,
CHARINDEX('-', col, CHARINDEX('-', col) + 1) -
CHARINDEX('-', col) - 1) AS certno,
SUBSTRING(col, CHARINDEX('-', col, CHARINDEX('-', col) + 1) + 1, LEN(col))
AS depcode
FROM T2;
请注意,这里很难使用STRING\u SPLIT
,因为很难从该函数的表值响应中寻址给定的记录。这里:
CREATE TABLE YourTable(
CLNTCODE VARCHAR(25),
certno VARCHAR(25),
depcode VARCHAR(25)
);
WITH StrTbl(Col1, Col3, Str) AS
(
SELECT LEFT(Str, CHARINDEX('-', Str) - 1) Col1,
LEFT(REVERSE(Str), CHARINDEX('-', REVERSE(Str)) - 1) Col3,
Str
FROM
(
SELECT '0021C-15563017-2' AS Str
UNION
SELECT '0021C-1-2'
) T
)
INSERT INTO YourTable (CLNTCODE, certno, depcode)
SELECT Col1,
REPLACE(REPLACE(REPLACE(Str, Col1, ''), Col3, ''), '-', '') AS Col2,
Col3
FROM StrTbl;
SELECT *
FROM YourTable;
结果:
+----+----------+----------+---------+
| | CLNTCODE | certno | depcode |
+----+----------+----------+---------+
| 1 | 0021C | 15563017 | 2 |
| 2 | 0021C | 1 | 2 |
+----+----------+----------+---------+
如果适合某人,也可以使用下面的方法
INSERT INTO T2 (CLNTCODE, certno, depcode)
SELECT LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2') - 1) AS CLNTCODE,
LEFT(REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), ''), CHARINDEX('-', REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), '')) - 1) AS certno,
LEFT(REVERSE('0021C-15563017-2'), CHARINDEX('-', REVERSE('0021C-15563017-2')) - 1) AS depcode
检查表T2是否有数据,它是否没有数据,然后您如何期望数据您需要什么请解释清楚您是否要求将这些('0021c'、'15563017'、'2')数据插入T2表?我想在表中插入拆分值('0021c-15563017-2-),如图所示。这是什么颜色?@Rahulray。我假设包含字符串的列名为
col
。这是返回正确的值,但没有在T2表中插入数据,然后使用INSERT-INTO…SELECT
,然后使用我的查询。这恰好在这里起作用,因为0021C
小于15563017-2
,依次小于2
。如果字符串是15563017-0021C-2
,则我认为此解决方案不起作用。如果行返回的顺序或顺序很重要,请不要使用string\u SPLIT
。aroundI还有许多类似函数的其他实现,我觉得好像我在什么地方见过这个答案:-)@TimBiegeleisen我觉得有人这么认为,并把我的答案录下来,因为他认为我复制/粘贴了他自己的答案,这是错误的:)我也不喜欢对CHARINDEX()的三重调用,因为可以避免:)@Sami这个返回字符串“0021C-1-2”的错误结果,它应该返回-0021C,1,2,但它返回0021C,1-2,2这个返回错误的结果,它返回->clntcode=0021C,certno=1-2,depcode=2。对我来说,它返回正确。clntcode=0021C,certno=1,depcode=2。请重试,可能存在其他问题。只需将所有出现的“0021C-15563017-2”替换为“0021C-1-2”。如果你还面临任何问题,请告诉我。
INSERT INTO T2 (CLNTCODE, certno, depcode)
SELECT LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2') - 1) AS CLNTCODE,
LEFT(REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), ''), CHARINDEX('-', REPLACE('0021C-15563017-2', LEFT('0021C-15563017-2', CHARINDEX('-', '0021C-15563017-2')), '')) - 1) AS certno,
LEFT(REVERSE('0021C-15563017-2'), CHARINDEX('-', REVERSE('0021C-15563017-2')) - 1) AS depcode