带有子字符串charindex的sql查询
嗨,如果可能的话,我需要一些帮助 我需要用table2.cat更新table1.value,其中id_数据为43,其中id_值=值的',直到下一个',如果'id_t'中的每个组都有数字 我尝试了一个简单的查询,但它返回了一些null,但“value”不能为null带有子字符串charindex的sql查询,sql,sql-server,substring,charindex,Sql,Sql Server,Substring,Charindex,嗨,如果可能的话,我需要一些帮助 我需要用table2.cat更新table1.value,其中id_数据为43,其中id_值=值的',直到下一个',如果'id_t'中的每个组都有数字 我尝试了一个简单的查询,但它返回了一些null,但“value”不能为null table1 :::::::::::::::::::::::::::::::::: id | id_data | id_t | value 1 | 43 | 1 | 2 | 46 | 1 | 1
table1
::::::::::::::::::::::::::::::::::
id | id_data | id_t | value
1 | 43 | 1 |
2 | 46 | 1 | 111,112,113
3 | 43 | 2 |
4 | 46 | 2 | 90,5
table2
:::::::::::::::::::::::::::::::::::
id_value | cat
112 | cat1
5 | cat2
我一直在尝试合并CHARINDEX,以从中获取信息,但我就是不知道它是如何工作的
理想情况下,它应该如下所示:
update table1
set value = (select cat from table2
where convert(nvarchar,id_value) = substring(value,5,3))
where id_data='43'
有人能给我指一下正确的方向吗
我想这很简单。。但我还在学习
提前谢谢
:::::::::
更新1
::::::::::::::::::::::::::::::::::
id | id_data | id_t | value
1 | 43 | 1 | cat1
2 | 46 | 1 | 111,112,113
3 | 43 | 2 | cat2
4 | 46 | 2 | 90,5
这不干净,也不是我推荐的,但您可能会找到一些帮助:
17974492 1 999251 somevalue
17974493 2 999251 somevalue
17974494 3 999251 somevalue
17974495 4 999251 somevalue
17974496 5 999251 somevalue
17974497 43 999251 (thishsouldbeupdated)
17974498 6 999251 somevalue
17974499 7 999251 somevalue
17974500 46 999251 111,311
17974501 8 999251 somevalue
17974502 9 999251 somevalue
17974503 10 999251 somevalue
17974504 11 999251 somevalue
17974505 12 999251 somevalue
17974506 13 999251 somevalue
17974507 1 999252 somevalue
17974508 2 999252 somevalue
17974509 3 999252 somevalue
17974510 4 999252 somevalue
17974511 5 999252 somevalue
17974512 43 999252 (thisshouldbeupdated)
17974513 6 999252 somevalue
17974514 7 999252 somevalue
17974515 46 999252 98,98
17974516 8 999252 somevalue
17974517 9 999252 somevalue
17974518 10 999252 somevalue
17974519 11 999252 somevalue
17974520 12 999252 somevalue
17974521 13 999252 somevalue
更新:关于使用第二个数字作为更新的说明
试试这个
DECLARE @table1 TABLE(id INT,id_data INT,id_t INT,value VARCHAR(100));
INSERT INTO @table1 VALUES
(1,43,1,NULL)
,(2,46,1,'111,112,113')
,(3,43,2,NULL)
,(4,46,2,'90,5')
DECLARE @table2 TABLE(id_value INT,cat VARCHAR(100));
INSERT INTO @table2 VALUES
(112,'cat1')
,(5,'cat2');
SELECT t1.id
,t1.id_data
,t1.id_t
,ID.List
,(
SELECT t2.cat
FROM @table2 AS t2 WHERE CHARINDEX(',' + CAST(t2.id_value AS VARCHAR(100)) + ',',',' + ID.List + ',')>0
)
FROM @table1 AS t1
OUTER APPLY(SELECT x.value FROM @table1 AS x WHERE x.id_t=t1.id_t AND x.value IS NOT NULL) AS ID(List)
WHERE t1.value IS NULL
这不干净,也不是我推荐的,但您可能会找到一些帮助:
17974492 1 999251 somevalue
17974493 2 999251 somevalue
17974494 3 999251 somevalue
17974495 4 999251 somevalue
17974496 5 999251 somevalue
17974497 43 999251 (thishsouldbeupdated)
17974498 6 999251 somevalue
17974499 7 999251 somevalue
17974500 46 999251 111,311
17974501 8 999251 somevalue
17974502 9 999251 somevalue
17974503 10 999251 somevalue
17974504 11 999251 somevalue
17974505 12 999251 somevalue
17974506 13 999251 somevalue
17974507 1 999252 somevalue
17974508 2 999252 somevalue
17974509 3 999252 somevalue
17974510 4 999252 somevalue
17974511 5 999252 somevalue
17974512 43 999252 (thisshouldbeupdated)
17974513 6 999252 somevalue
17974514 7 999252 somevalue
17974515 46 999252 98,98
17974516 8 999252 somevalue
17974517 9 999252 somevalue
17974518 10 999252 somevalue
17974519 11 999252 somevalue
17974520 12 999252 somevalue
17974521 13 999252 somevalue
更新:关于使用第二个数字作为更新的说明
试试这个
DECLARE @table1 TABLE(id INT,id_data INT,id_t INT,value VARCHAR(100));
INSERT INTO @table1 VALUES
(1,43,1,NULL)
,(2,46,1,'111,112,113')
,(3,43,2,NULL)
,(4,46,2,'90,5')
DECLARE @table2 TABLE(id_value INT,cat VARCHAR(100));
INSERT INTO @table2 VALUES
(112,'cat1')
,(5,'cat2');
SELECT t1.id
,t1.id_data
,t1.id_t
,ID.List
,(
SELECT t2.cat
FROM @table2 AS t2 WHERE CHARINDEX(',' + CAST(t2.id_value AS VARCHAR(100)) + ',',',' + ID.List + ',')>0
)
FROM @table1 AS t1
OUTER APPLY(SELECT x.value FROM @table1 AS x WHERE x.id_t=t1.id_t AND x.value IS NOT NULL) AS ID(List)
WHERE t1.value IS NULL
一般建议:不要在数据库表中存储CSV数据。这意味着你的数据没有标准化,通常很难处理。对不起,我不明白你的逻辑。。。是否存在
cat1
,因为下一行的id\u data=46
在逗号和您设置的cat2
之间的某个地方得到了112
,因为下一行得到了5
?这很奇怪,而且气味很难闻……id\u t
将它们“分组”到第一个表中,每个“组”都有一个id\u数据46
记录,其中每个id\u t
应该加入的id是(第二个记录,在“,”之后)。我需要为每个id更新id\u数据43
_t@Shnugo再次阅读你的评论,我想我现在明白你的意思了,对不起。实际上,表1和表2通过表1上逗号之间的第二条记录连接在一起。我知道这有点奇怪,但我正在处理一个已经定义好的表,现在无法更改。@vvic,这太糟糕了。。。如果您的第一个表有11111 2,5113
,会发生什么情况?您是选择cat
、cat2
还是两者都选?每个id\u t
是否总是正好有两行?id\u数据的用途是什么?id
列的顺序是否严格(包含CSV编号的行的id是否始终为id+1)?一般建议:不要将CSV数据存储在数据库表中。这意味着你的数据没有标准化,通常很难处理。对不起,我不明白你的逻辑。。。是否存在cat1
,因为下一行的id\u data=46
在逗号和您设置的cat2
之间的某个地方得到了112
,因为下一行得到了5
?这很奇怪,而且气味很难闻……id\u t
将它们“分组”到第一个表中,每个“组”都有一个id\u数据46
记录,其中每个id\u t
应该加入的id是(第二个记录,在“,”之后)。我需要为每个id更新id\u数据43
_t@Shnugo再次阅读你的评论,我想我现在明白你的意思了,对不起。实际上,表1和表2通过表1上逗号之间的第二条记录连接在一起。我知道这有点奇怪,但我正在处理一个已经定义好的表,现在无法更改。@vvic,这太糟糕了。。。如果您的第一个表有11111 2,5113
,会发生什么情况?您是选择cat
、cat2
还是两者都选?每个id\u t
是否总是正好有两行?id\u数据的用途是什么?id
列的顺序是否严格(包含CSV编号的行的id是否始终为id+1)?我想你把我弄丢了……对不起。那么,更新查询应该是这样的<代码>更新表1集合值=(从表2中选择cat,其中CHARINDEX(','+CAST(id_值为VARCHAR(100))+',',','+id.List+',')>0)从表1外部应用(从表1中选择x.value作为x,其中x.id_t=t1.id_t和x.value不为NULL)作为id(List),其中id_data='43'
我正在测试它,它几乎就在那里,XML技巧非常有效。但是,如果我按照您示例中的方式执行,它将得到0行更新。如果我删除,其中t1.value为NULL
,它会更新每一行。那么,如果我只想更新id\u data='43'
?另外,我如何检查“,”仅在id\u data='46'
上,而不是在它不为null的地方?(除了43和46之外,还有更多的id\u数据可以包含数据)。我将用我尝试过的内容更新原始问题。非常感谢您的帮助。我已经尝试过了,但是由于一些奇怪的空值而出现错误,它已经修复,现在工作正常。非常感谢。我想你把我弄丢了……对不起。那么,更新查询应该是这样的<代码>更新表1集合值=(从表2中选择cat,其中CHARINDEX(','+CAST(id_值为VARCHAR(100))+',',','+id.List+',')>0)从表1外部应用(从表1中选择x.value作为x,其中x.id_t=t1.id_t和x.value不为NULL)作为id(List),其中id_data='43'
我正在测试它,它几乎就在那里,XML技巧非常有效。但是,如果我按照您示例中的方式执行,它将得到0行更新。如果我删除,其中t1.value为NULL
,它会更新每一行。那么,如果我只想更新id\u data='43'
?另外,我如何检查“,”仅在id\u data='46'
上,而不是在它不为null的地方?(除了43和46之外,还有更多的id\u数据可以包含数据)。我将用我尝试过的内容更新原始问题。非常感谢您的帮助。我已经尝试过了,但是由于一些奇怪的空值而出现错误,它已经修复,现在工作正常。谢谢。
DECLARE @table1 TABLE(id INT,id_data INT,id_t INT,value VARCHAR(100));
INSERT INTO @table1 VALUES
(17974492,1,999251,'somevalue')
,(17974493,2,999251,'somevalue')
,(17974494,3,999251,'somevalue')
,(17974495,4,999251,'somevalue')
,(17974496,5,999251,'somevalue')
,(17974497,43,999251,'(thishsouldbeupdated)')
,(17974498,6,999251,'somevalue')
,(17974499,7,999251,'somevalue')
,(17974500,46,999251,'111,311')
,(17974501,8,999251,'somevalue')
,(17974502,9,999251,'somevalue')
,(17974503,10,999251,'somevalue')
,(17974504,11,999251,'somevalue')
,(17974505,12,999251,'somevalue')
,(17974506,13,999251,'somevalue')
,(17974507,1,999252,'somevalue')
,(17974508,2,999252,'somevalue')
,(17974509,3,999252,'somevalue')
,(17974510,4,999252,'somevalue')
,(17974511,5,999252,'somevalue')
,(17974512,43,999252,'(thisshouldbeupdated)')
,(17974513,6,999252,'somevalue')
,(17974514,7,999252,'somevalue')
,(17974515,46,999252,'98,98')
,(17974516,8,999252,'somevalue')
,(17974517,9,999252,'somevalue')
,(17974518,10,999252,'somevalue')
,(17974519,11,999252,'somevalue')
,(17974520,12,999252,'somevalue')
,(17974521,13,999252,'somevalue');
DECLARE @table2 TABLE(id_value INT,cat VARCHAR(100));
INSERT INTO @table2 VALUES
(311,'cat1')
,(98,'cat2');
WITH UpdateableCTE AS
(
SELECT t1.id
,t1.id_data
,t1.id_t
,SecondNr
,(
SELECT t2.cat
FROM @table2 AS t2 WHERE t2.id_value=SecondNr
) AS NewCat
,t1.value
FROM @table1 AS t1
OUTER APPLY(SELECT CAST('<x>' + REPLACE(x.value,',','</x><x>') + '</x>' AS XML).value('/x[2]','int')
FROM @table1 AS x
WHERE x.id_t=t1.id_t AND x.id_data=46) AS ID(SecondNr)
WHERE t1.id_data=43
)
UPDATE UpdateableCTE SET value=NewCat;
SELECT * FROM @table1;