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 / 问题 / 207029
Accepted
Sir Swears-a-lot
Sir Swears-a-lot
Asked: 2018-05-18 02:38:10 +0800 CST2018-05-18 02:38:10 +0800 CST 2018-05-18 02:38:10 +0800 CST

如何在每个第二个分隔符上拆分一个字符串?

  • 772

我的曲线由 X/Y 点(数组?)组成,存储在具有相同分隔符的字符串中。每行有 1 条曲线。下面是一个简单的例子:

0,0,1,1,2,1.9,2.9,2.8,3.6,3.5

我想将每条曲线提取到 #table 中,以便我可以编辑它们并最终将它们放回去。

X,Y
0,0
1,1
2,1.9
2.9,2.8
3.6,3.5

一条曲线可能有十几个到数百个值,并且这些点可能没有顺序。

最干净/最简单的方法是什么?

csv sql-server-2016
  • 2 2 个回答
  • 936 Views

2 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2018-05-18T03:27:23+08:002018-05-18T03:27:23+08:00

    我创建了一个表值函数(取自此处)来创建字符串的有序拆分。

    CREATE FUNCTION dbo.SplitStrings
    (
        @List       NVARCHAR(MAX),
        @Delimiter  NVARCHAR(255)
    )
    RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAR(255))
    AS
    BEGIN
        INSERT @t(Item) SELECT SUBSTRING(@List, Number, 
            CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
        FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
            FROM sys.all_objects) AS n(Number)
        WHERE Number <= CONVERT(INT, LEN(@List))
            AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
        ORDER BY Number OPTION (MAXDOP 1);
    
        RETURN;
    END
    GO
    

    然后我在下面的代码中使用了那个 TVF

    Declare @X table (string varchar(50))
    insert into @x (string) values('0,0,1,1,2,1.9,2.9,2.8,3.6,3.5')
    SELECT s1.Item AS colx
        ,s2.item AS coly
    FROM @x AS x
    CROSS APPLY dbo.SplitStrings(x.string, ',') AS s1
    CROSS APPLY dbo.SplitStrings(x.string, ',') AS s2
    WHERE s2.[Index] = s1.[Index] + 1
        AND s1.[index] % 2 = 1
        AND s2.[Index] % 2 = 0
    

    代码使用 将您的字符串传入SplitStringTVF CROSS APPLY。我们使用 TWOCROSS APPLY的。一个用于 X 列(别名 s1),一个用于 Y 列(别名 s2)。

    每个表(s1 和 s2)的行排序完全相同。我基本上是在使用您在问题中评论过的逻辑。

    嗯,我可以拆分每个值并使用奇数/偶数行号拆分为 x、y 吗?

    我们知道 X 序列值是奇数,Y 序列值是偶数。逻辑是确保 s2 索引(代表 Y 列)是 s1 行(代表 X 列)的 +1。

    WHERE s2.[Index] = s1.[Index] + 1

    我们想通过使用modulus operator (%). 如果 s1.index / 2 = 1 的余数,我们有一个奇数行

    AND s1.[index] % 2 = 1
    

    我们想通过使用modulus operator (%). 如果 s1.index / 2 = 2 的余数,我们有一个偶数行

    AND s1.[index] % 2 = 0
    

    它似乎适用于您的示例数据。

    | colx | coly |
    |------|------|
    | 0    | 0    |
    | 1    | 1    |
    | 2    | 1.9  |
    | 2.9  | 2.8  |
    | 3.6  | 3.5  |
    
    • 2
  2. jyao
    2018-05-18T14:14:22+08:002018-05-18T14:14:22+08:00

    由于您运行的是 sql server 2016,您实际上可以使用新的string_split函数,这里是一个更简单的版本,在您的评论中使用您的真实数据

    DECLARE @num varchar(max) ='990,44,1010,86,1030,140,1050,202,1100,392,1150,662,1200,1088,1300,2400,1400,4200,1500,6300,1600,8700,1700,11400,1800,14450,1900,17800,2000,21750,2250,33350,2500,46100,2750,59900,3000,74750,3500,109500';
    ; with c as (
                 select value from string_split(@num, ',') 
                )
    , c2 as (
              select value, rn=ROW_NUMBER() over (order by (select null)) 
              from c
            ) 
    select X=value, t.Y from c2 as nc
    cross apply (select value from c2 where nc.rn = c2.rn-1) T(y) 
    where rn%2=1
    

    结果如下

    在此处输入图像描述

    • 1

相关问题

  • 如何从单个列中检索“y”和“n”逗号分隔值作为“是”或“否”

  • MS Access 中的高级 CSV 导出格式

  • 我可以从 SSMS 查询制表符分隔的文件吗?

  • PostgreSQL COPY FROM 的行为

  • 在 SQLite 上写入一行需要多少次磁盘寻道?

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