AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 326477
Accepted
Shiva
Shiva
Asked: 2023-04-27 02:31:03 +0800 CST2023-04-27 02:31:03 +0800 CST 2023-04-27 02:31:03 +0800 CST

即使与另一个列值部分匹配,也将特定字符串替换为空白

  • 772

如果部分单词与另一列匹配,我有一个场景可以从一组逗号分隔的字符串中替换整个字符串。

我发现用文字解释非常复杂,因此我通过包含各种示例的屏幕截图进行了解释。

请帮助我使用存储过程或函数或查询来获得如下屏幕截图中Required_result列中的结果。

截屏

我尝试使用STRING_SPLIT函数来拆分值并连接表。我对解决这个问题的逻辑感到震惊。

sql-server
  • 1 1 个回答
  • 75 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2023-04-27T04:15:45+08:002023-04-27T04:15:45+08:00

    样本数据

    CREATE TABLE dbo.Test
    (
        ID integer NOT NULL,
        Col1 varchar(8000) NOT NULL,
        Col2 varchar(8000) NOT NULL,
        Required_result varchar(8000) NULL
    );
    
    INSERT dbo.Test
        (ID, Col1, Col2)
    VALUES
        (1, 'pencil red', 'charcoal, pencil, scale'),
        (2, 'pencil red', 'charcoal, red, scale'),
        (3, 'ball pen', 'eraser, pen'),
        (4, 'ball pen', 'ball, box'),
        (5, 'ball pen', 'eraser, ball pen'),
        (6, 'ball pen', 'eraser, pen ball'),
        (7, 'ball pen', 'eraser, watercan, bag'),
        (8, 'Note book', 'Note book'),
        (9, 'Note book', 'Note book, eraser'),
        (10, 'Note book', '');
    

    解决方案

    UPDATE dbo.Test
    SET Required_result =
        ISNULL
        (
            (
                SELECT 
                    -- Reassemble parts with no matches
                    result = STRING_AGG(LTRIM(SS.[value]), ', ')
                FROM dbo.Test AS T2
                CROSS APPLY STRING_SPLIT
                (
                    -- Remove commas before splitting
                    REPLACE(T2.Col2, ',', ''),
                    -- Split on spaces
                    SPACE(1)
                ) AS SS
                WHERE
                    -- For the current outer ID
                    T2.ID = dbo.Test.ID
                    -- Current part has no match
                    AND 0 = 
                        CHARINDEX
                        (
                            SPACE(1) + LTRIM(SS.[value]) + SPACE(1), 
                            SPACE(1) + T2.Col1 + SPACE(1)
                        )
            ),
            -- Empty string instead of NULL if everything matched
            SPACE(0)
        );
    

    结果

    ID 列1 列2 必填_结果
    1个 铅笔红 木炭、铅笔、秤 木炭,规模
    2个 铅笔红 木炭, 红色, 规模 木炭,规模
    3个 圆珠笔 橡皮、笔 橡皮
    4个 圆珠笔 球,盒子 盒子
    5个 圆珠笔 橡皮、圆珠笔 橡皮
    6个 圆珠笔 橡皮、圆珠笔 橡皮
    7 圆珠笔 橡皮、水罐、袋子 橡皮、水罐、袋子
    8个 笔记本 笔记本
    9 笔记本 记事本、橡皮擦 橡皮
    10 笔记本

    数据库<>小提琴


    如果需要保证保留 Col2 字符串组件的顺序,请在(需要 Azure SQL 数据库或 SQL Server 2022)的可选enable_ordinal参数中传递值 1STRING_SPLIT并添加WITHIN GROUP (ORDER BY SS.ordinal)到STRING_AGG聚合中:

    UPDATE dbo.Test
    SET Required_result =
        ISNULL
        (
            (
                SELECT 
                    -- Reassemble parts with no matches
                    result = STRING_AGG(LTRIM(SS.[value]), ', ')
                        WITHIN GROUP (ORDER BY SS.ordinal)
                FROM dbo.Test AS T2
                CROSS APPLY STRING_SPLIT
                (
                    -- Remove commas before splitting
                    REPLACE(T2.Col2, ',', ''),
                    -- Split on spaces
                    SPACE(1),
                    -- Enable ordinal
                    1
                ) AS SS
                WHERE
                    -- For the current outer ID
                    T2.ID = dbo.Test.ID
                    -- Current part has no match
                    AND 0 = 
                        CHARINDEX
                        (
                            SPACE(1) + LTRIM(SS.[value]) + SPACE(1), 
                            SPACE(1) + T2.Col1 + SPACE(1)
                        )
            ),
            -- Empty string instead of NULL if everything matched
            SPACE(0)
        );
    
    • 7

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve