带有子字符串charindex的sql查询

维维
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

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

我需要用 table2.cat 更新 table1.value,其中 id_data 为 43,其中 id_value = 值“,”之后的数字,直到下一个“,”,如果“id_t”中的每个组都有的话

我尝试了一个简单的查询,但它返回了一些空值,但“值”不能为空

update table1 
set value = (select cat from table2 
            where convert(nvarchar,id_value) = substring(value,5,3))
where id_data='43'

我一直在尝试合并 CHARINDEX 以从 ',' 中获取,但我无法弄清楚它是如何工作的。

理想情况下,它应该如下所示:

::::::::::::::::::::::::::::::::::
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

任何人都可以指出我正确的方向吗?

我想这很简单......但我仍在学习......

提前致谢。

::::::::::::::::

更新1

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.value IS NOT NULL AND id_data='46') AS ID(SecondNr)
    WHERE t1.value IS NULL
)
UPDATE UpdateableCTE SET value=NewCat;
--somehow where id_data='43'

我将在这里留下一张表,它看起来更像真实的一张表,其中包含所有 id_data 和字段:

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

更新:您关于使用第二个数字作为更新的解释

试试这个

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');

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.value IS NOT NULL) AS ID(SecondNr)
    WHERE t1.value IS NULL
)
UPDATE UpdateableCTE SET value=NewCat;

SELECT * FROM @table1

这个概念是可更新的 CTE,您可以在其中使用法线SELECT来获取所需的值。然后您可以直接更新派生表(只要只有一个表的列受到影响)。

OUTER APPLY使用了一招XML到CSV列表以便读取第二个数字拆分。

更新 2:使用您的新样本数据

以下将使用新的示例数据并使用 ID:

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XQuery对带有子字符串的字符串

来自分类Dev

带有子字符串的StringIndexOutOfBoundsException

来自分类Dev

子字符串SQL查询变量

来自分类Dev

如何在Google查询语言中使用子字符串和charindex

来自分类Dev

Rails 4 + SQL Lite:查找带有大字符串子字符串的记录吗?

来自分类Dev

在子字符串中使用Charindex会导致错误

来自分类Dev

如何比较带有子查询的字符串linq和带有子查询的另一个linq

来自分类Dev

带有限制的子字符串(pyspark.sql.Column.substr)

来自分类Dev

来自带有特殊字符'/'的字符串的Javascript子字符串字符

来自分类Dev

查询字符串参数'URL'包含带有查询字符串的URL

来自分类Dev

SQL选择查询,其中列像字符串一样,带有和不带有空格

来自分类Dev

htaccess将具有查询字符串的重定向域重定向到带有排除项的子域

来自分类Dev

带有查询字符串的URL重定向-htaccess

来自分类Dev

Laravel带有查询字符串的路由URL

来自分类Dev

Twitter分享带有查询字符串的链接

来自分类Dev

带有查询字符串键的WP自动登录

来自分类Dev

.htaccess允许带有查询字符串

来自分类Dev

带有多个查询字符串的Apache Rewrite

来自分类Dev

Twitter分享带有查询字符串的链接

来自分类Dev

如何获取带有“?”的URL查询字符串 里面?

来自分类Dev

htaccess删除带有查询字符串的特定地址

来自分类Dev

找不到带有查询字符串参数的文档

来自分类Dev

带有查询字符串的 Angular 5 路由

来自分类Dev

带有子字符串的奇怪行为

来自分类Dev

在LINQ中找出带有子字符串的单词

来自分类Dev

带有html标签的Javascript子字符串

来自分类Dev

最长的普通子字符串,带有滚动哈希

来自分类Dev

带有条件语句的子字符串

来自分类Dev

带有子字符串条件的Bash while循环

Related 相关文章

  1. 1

    XQuery对带有子字符串的字符串

  2. 2

    带有子字符串的StringIndexOutOfBoundsException

  3. 3

    子字符串SQL查询变量

  4. 4

    如何在Google查询语言中使用子字符串和charindex

  5. 5

    Rails 4 + SQL Lite:查找带有大字符串子字符串的记录吗?

  6. 6

    在子字符串中使用Charindex会导致错误

  7. 7

    如何比较带有子查询的字符串linq和带有子查询的另一个linq

  8. 8

    带有限制的子字符串(pyspark.sql.Column.substr)

  9. 9

    来自带有特殊字符'/'的字符串的Javascript子字符串字符

  10. 10

    查询字符串参数'URL'包含带有查询字符串的URL

  11. 11

    SQL选择查询,其中列像字符串一样,带有和不带有空格

  12. 12

    htaccess将具有查询字符串的重定向域重定向到带有排除项的子域

  13. 13

    带有查询字符串的URL重定向-htaccess

  14. 14

    Laravel带有查询字符串的路由URL

  15. 15

    Twitter分享带有查询字符串的链接

  16. 16

    带有查询字符串键的WP自动登录

  17. 17

    .htaccess允许带有查询字符串

  18. 18

    带有多个查询字符串的Apache Rewrite

  19. 19

    Twitter分享带有查询字符串的链接

  20. 20

    如何获取带有“?”的URL查询字符串 里面?

  21. 21

    htaccess删除带有查询字符串的特定地址

  22. 22

    找不到带有查询字符串参数的文档

  23. 23

    带有查询字符串的 Angular 5 路由

  24. 24

    带有子字符串的奇怪行为

  25. 25

    在LINQ中找出带有子字符串的单词

  26. 26

    带有html标签的Javascript子字符串

  27. 27

    最长的普通子字符串,带有滚动哈希

  28. 28

    带有条件语句的子字符串

  29. 29

    带有子字符串条件的Bash while循环

热门标签

归档