我正在使用的数据库是SQL Server 2022.

我有一张桌子,上面有像1010080PC这样的商品编号,以C结尾. 我也有类似1010080或1010080P的项目(末尾没有C),如果ItemNr中的项目编号不是以C结尾,我想将项目1010080PC添加到最后一列GuaranteeItem

MATNR GuaranteeItem
1010080 1010080PC
1010080P 1010080PC
1010080PC (empty)

由于1010080PC已经以C结尾,我不想在最后一栏中输入任何内容.

该表大约有170,000行,其中大约有10行.1,700有一项以C结尾. 我预计大约需要编辑3,400行

这就是我想要的结果:

MATNR GuaranteeItem
1010010
1010021
1010031P 1010031PC
1010031PC
1010040
1010061
1010070
1010080 1010080PC
1010080PC
1011010
1011021
1011030
1017511
1017530
1017531
1017592 1017592PC
1017592P 1017592PC
1017592PC
1017611
1017821
1017941
1017951
1017961 1017961PC
1017961P 1017961PC
1017961PC
1017981

我已经为这个问题斗争了一段时间,但我一直没有找到一个可行的解决方案. 我所做的工作如下

我只用以‘C’结尾的ItemNr做了一个试探表

SELECT DISTINCT
    prd.MARA.MATNR
    INTO prd.TempTable
FROM 
    prd.MARA
WHERE
prd.MARA.MATNR LIKE '%C'

接下来,我try 将ItemNr+‘%C’与临时表中的ItemNr匹配.如果临时表中存在ItemNr+‘%C’,则将临时表中的ItemNr添加到列GuaranteeItem


SELECT DISTINCT
    prd.MARA.MATNR
    , CASE
        WHEN CONCAT(prd.MARA.MATNR, '%C') IN (SELECT prd.TempTable.MATNR FROM prd.TempTable) THEN prd.TempTable.MATNR
        WHEN prd.MARA.MATNR LIKE '%C' THEN '' 
        ELSE ''
        END AS GuaranteeItem
FROM
    prd.MARA
LEFT JOIN
    prd.TempTable ON prd.TempTable.MATNR = prd.MARA.MATNR

不知怎么的,我配不上WHEN CONCAT(prd.MARA.MATNR, '%C') IN (SELECT prd.TempTable.MATNR FROM prd.TempTable) THEN

任何解决这个问题的建议都将受到我们的感激.

推荐答案

您可以在CASE表达式中使用EXISTS运算符,如下所示:

SELECT MATNR,  
  CASE 
    WHEN
      EXISTS
        (
          SELECT 1 FROM tbl_name D
          WHERE D.MATNR = CONCAT(T.MATNR, 'PC') OR
                D.MATNR = CONCAT(T.MATNR, 'C')
        )
    THEN CONCAT(T.MATNR, IIF(RIGHT(T.MATNR, 1) = 'P', 'C','PC')) 
  ELSE '' END AS GuaranteeItem
FROM tbl_name T

Demo

Sql相关问答推荐

如何退回当年的所有参赛作品?""

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

最小非重复集的SQL查询

SQL查询正在工作,但返回空结果

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

PostgreSQL中递归CTE查询的故障过滤

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

在 PostgreSQL 中使用 ltree 列进行累积

根据标识符将两行合并为一行

从每月生成的系列中生成每日汇率

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

从输出中删除 jsonb_build_object

在 SQL Server 中合并两个 XML 列

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

如何在 case 语句中使用聚合?

如何根据某个值在where子句中添加某个条件

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

SQLite 中的过滤运行总和视图

Amazon Redshift - 子计划的哈希表不存在