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 / 问题 / 230382
Accepted
shawnyshawny
shawnyshawny
Asked: 2019-02-22 05:40:33 +0800 CST2019-02-22 05:40:33 +0800 CST 2019-02-22 05:40:33 +0800 CST

SQL Server 2017 - 在包含列映射的字符串中提取源和目标列名称

  • 772

我将以下格式字符串存储在文本中(可以是任意数量的列):

col1_source|col1_target;col2_source|col2_target;col3_source|col3_target;...

我试图想出一种优雅的方法来提取和隔离所有 xxx_source 列名和所有 xxx_target 列名,以便我可以将它们存储在变量中并获得以下最终结果:

@Source_Columns = 'col1_source,col2_source,col3_source' @Target_Columns = 'col1_target,col2_target,col3_target'

在一天结束时,我想对我的源列和目标列执行 SELECT 以执行数据比较。

这是我到目前为止所取得的成就,但我发现它太复杂了(使用表值函数):

CREATE FUNCTION [dbo].[UF_miscParseStringToTable]
    (
        @list   nvarchar(MAX)
        , @sep  varchar(8) 
    ) 
RETURNS @ts table
    (
        [ID]        int identity
        , [value]   nvarchar(MAX)
    )
AS 
BEGIN 

    -- Parameters check
    if ((@sep is null) or (datalength(@sep) < 1)) return 

    if ((@list is null) or (@list = '') or (@list = @sep)) return

    -- Add path wildcards directly with sep
    -- ?worth it?
    if (left(@sep, 1) <> '%')   set @sep = '%' + @sep
    if (right(@sep, 1) <> '%')  set @sep = @sep + '%'

    -- First first sep
    declare @i int
    set @i = patindex(@sep, @list)

    -- Acc values
    while (@i > 0) begin
        insert into @ts ([value]) values (rtrim(left(@list, @i - 1)))
        set @list = ltrim(right(RTRIM(@list), len(@list) + 3 - (@i + len(@sep) )))
        set @i = patindex(@sep, @list)
    end

    set @list = rtrim(@list)
    -- Insert last value, if any
    if (@list <> '') insert into @ts (value) values (@list)

    return

END

上面的函数基本上采用我的映射字符串并将其转换为表中的列名列表(请参见下面的查询逻辑):

DECLARE @Delim varchar(1) = '|'
DECLARE @Mapping varchar(max) = 'col1_source|col1_target;col2_source|col2_target;col3_source|col3_target'  
DECLARE @String varchar(max) = REPLACE(@Mapping,';', @Delim)
SELECT * FROM dbo.UF_miscParseStringToTable(@String, @Delim)

以上结果查询产生下表:

 ID| value
 1 | col1_source
 2 | col1_target
 3 | col2_source
 4 | col2_target
 5 | col3_source
 6 | col3_target

我也许可以对列索引进行联接,但是我发现很难隔离源字段和目标字段以便我可以在它们之间执行数据比较。此外,如果不需要的话,我想避免对表执行额外的连接。

以下是所需的结果(以便能够执行以下操作):

SELECT col1_source, col2_source, col3_source FROM mytable;

SELECT col1_target, col2_target, col3_target FROM mytable;

任何帮助或想法都会很棒!

肖恩

string sql-server-2017
  • 1 1 个回答
  • 157 Views

1 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2019-02-22T06:44:12+08:002019-02-22T06:44:12+08:00

    您没有指定 RDBMS - 我的解决方案使用 SQL Server。

    您的问题表明您有一个存储在文本中的格式化字符串

    col1_source|col1_target;col2_source|col2_target;col3_source|col3_target;...
    

    你进一步说明

    我试图想出一种优雅的方法来提取和隔离所有 xxx_source 列名和所有 xxx_target 列名,以便我可以将它们存储在变量中并获得以下最终结果:

    @Source_Columns = 'col1_source,col2_source,col3_source' @Target_Columns = 'col1_target,col2_target,col3_target'


    我的解决方案使用 SQL Server 2016 STRING_SPLIT。如果您未达到该版本,还有其他方法可以拆分字符串。

    drop table if exists #temp
    Declare @String varchar(100) = 'col1_source|col1_target;col2_source|col2_target;col3_source|col3_target;'
    ----------------------------
    Declare @SourceColumns varchar(max)
    Declare @TargetColumns varchar(max)
    
    --Split on semicolon and use PARSENAME to extract the source and target column information
    SELECT @SourceColumns = isnull(@SourceColumns + ',', '') + SourceColumn
        ,@TargetColumns = isnull(@TargetColumns + ',', '') + TargetColumn
    FROM (
        SELECT parsename(replace(value, '|', '.'), 2) AS SourceColumn
            ,parsename(replace(value, '|', '.'), 1) AS TargetColumn
        FROM (
            SELECT *
            FROM String_split(@string, ';')
            ) a
        WHERE value <> ' '
        ) a
    

    选择@SourceColumns

    col1_source,col2_source,col3_source
    

    选择@TargetColumns

    col1_target,col2_target,col3_target
    
    • 0

相关问题

  • 在 PostgreSQL 9.2 中提取字符串

  • 为什么基于 SQL 的数据库服务器上的字符串函数从位置 1 而不是 0 开始?[关闭]

  • 修剪不适用于少数字符串

  • 遍历字符串,添加所有数字,例如 '123' = 1+2+3,包含工作循环的演示

  • 拆分字符串的不同部分

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