带有子字符串charindex的sql查询

带有子字符串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

嗨,如果可能的话,我需要一些帮助

我需要用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    | 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;