GVKun编程网logo

sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列(sql按逗号拆分列为多列)

18

在这里,我们将给大家分享关于sql–使用逗号分隔符将单列数据拆分为SSIS中的多个列的知识,让您更了解sql按逗号拆分列为多列的本质,同时也会涉及到如何更有效地asp.net–如何在SQLServer

在这里,我们将给大家分享关于sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列的知识,让您更了解sql按逗号拆分列为多列的本质,同时也会涉及到如何更有效地asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串、mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现、mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享、Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值的内容。

本文目录一览:

sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列(sql按逗号拆分列为多列)

sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列(sql按逗号拆分列为多列)

我在sql Server中有一个包含3列的表,其中一列是包含由逗号分隔的连续列行的数据列.第一行也是我想要创建的新表的标题行.所以基本上我想转此.
Data      | ID | Source 
====================
a,b,c,d,e | 1  | a.csv

f,g,h,i,j | 2  | b.csv

a | b | c | d | e
=================
f | g | h | i | j

使用SSIS,我能想到的唯一方法是使用转储到数据列的文本文件中,然后将其作为平面文件源重新读取,但我宁愿避免创建额外的不必要的文件

编辑:对不起我使用SSIS 2008

解决方法

你可以做的是按原样读取文件.
并在脚本任务中拆分这些值.

所以从源代码转到脚本任务.
然后在脚本任务作为输入列,选择包含这些值的列(InputColumn1).然后指定输出列(如果我是对的,我看到你有5,所以指定5(OutputColumn1-5)).

完成后,转到脚本本身(C#).

下:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
}

将以下代码放在那里:

var ColumnValue = Row.InputColumn1.Split(',');

Row.OutputColumn1 = ColumnValue[0];
Row.OutputColumn2 = ColumnValue[1];
Row.OutputColumn3 = ColumnValue[2];
Row.OutputColumn4 = ColumnValue[3];
Row.OutputColumn5 = ColumnValue[4];

在脚本任务之后,Source和OutputCoulmns1-5中的所有列都可用,您可以执行所需的操作.

OUTPUT

Data      | ID | Source |OutputColumn1 |OutputColumn2|  etc. 3-5
 ================================================================
 a,e | 1  | a.csv  |  a           |  b

 f,j | 2  | b.csv  |  f           |  g

请问是否有问题.

asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串

asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串

我有一个复选框列表.所选(已检查)的项目存储在List< string>中.选择.

例如,选择的值是星期一,星期二,星期四,7天

我正在转换List<>以逗号分隔的字符串,即

string a= "monday,tuesday,thursday"

现在,我将此值作为字符串传递给存储过程.我想解雇像:

Select * 
from tblx 
where days = 'Monday' or days = 'Tuesday' or days = 'Thursday'`

我的问题是:如何在存储过程中分离字符串?

解决方法

如果您将逗号分隔(任何分隔符)字符串传递给存储过程并在查询中使用,那么必须吐出该字符串然后您将使用它.

下面有例子:

DECLARE @str VARCHAR(500) = 'monday,thursday'
CREATE TABLE #Temp (tDay VARCHAR(100))
WHILE LEN(@str) > 0
BEGIN
    DECLARE @TDay VARCHAR(100)
    IF CHARINDEX(',',@str) > 0
        SET  @TDay = SUBSTRING(@str,CHARINDEX(',@str))
    ELSE
        BEGIN
        SET  @TDay = @str
        SET @str = ''
        END
  INSERT INTO  #Temp VALUES (@TDay)
 SET @str = REPLACE(@str,@TDay + ','')
 END

 SELECT * 
 FROM tblx 
 WHERE days IN (SELECT tDay FROM #Temp)

mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现

mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现

转自:http://www.maomao365.com/?p=10739
摘要:
下文讲述在 sqlserver 对逗号分隔的字符串转换为数据表的另类方法实现,如下所示:
实验环境:sql server 2008 R2 
实现思路:
将组合字符串中的逗号替换为 “''as n union all select ''”, 然后将替换后的字符串加上 select 和 前后加上单引号 是其成为可执行 sql 脚本,
最后运行替换后的字符串,就可以得到一张数据表,如下所示: 

declare @maomao365 varchar(1000)

set @maomao365 =''sqlserver,blog,other'';
---将逗号替换为 ''as n union all select '' 
set @maomao365 = REPLACE(@maomao365,'','',
'''''' as n union all select ''''''
);
---在字符串前面加上select 和单引号 ,后面也加上单引号 
set @maomao365 ='' select ''''''+ @maomao365 + '''''''';
print @maomao365

exec (@maomao365)

 

mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享

mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享

 转自:http://www.maomao365.com/?p=10278 

摘要:
下文讲述 sqlserver 中将使用逗号组合的单列数据,分隔为多列数据的方法
实验环境:sql server 2012 
实现思路:
1. 将逗号分隔的数据替换成为 xml 数据
2. 使用 xml 读取函数读取相关数据
例:
将包含逗号字符串拆分为多列的示例 

create table [maomao365.com]
(info varchar(200))
go
---生成基础数据
insert into [maomao365.com]
(info)values(''1,2,3,4,5''),
(''6,7,8,9''),(''10,11,23,24,45,67'')
go

---使用cte表达式转换为xml格式,转换为相应的列信息
;
with tmp as (
select ''<tmp>'' + replace(info,'','',''</tmp><tmp>'') + ''</tmp>'' as newInfo from [maomao365.com]
)

---生成xml信息
select 
convert(xml,newInfo).value(''tmp[1]'',''int'') as field1,
convert(xml,newInfo).value(''tmp[2]'',''int'') as field2,
convert(xml,newInfo).value(''tmp[3]'',''int'') as field3,
convert(xml,newInfo).value(''tmp[4]'',''int'') as field4,
convert(xml,newInfo).value(''tmp[5]'',''int'') as field5,
convert(xml,newInfo).value(''tmp[6]'',''int'') as field6
from tmp 
go
truncate table [maomao365.com]
drop table [maomao365.com]

Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值

Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值

如何解决Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值?

我继续之前程序员的一个项目的工作,查询有问题,因为字符串数据类型用逗号分隔,必须在查询中。

是否可以从 2 个表中查询得到这样的结果?

表用户

id 名称 技能
1 A 人 技能A、技能B、技能C
2 B 人 技能B、技能C、技能D
3 人物C 技能C,技能D
4 D 人 技能E,技能F
5 人物E 技能A,技能E
6 人 F 技能A,技能C
7 人 G 技能G、技能H、技能X、技能Y、技能Z

表工作

id 工作技能
1 技能C、技能D、技能G

结果查询

名称
A 人
B 人
人物C
人 F
人 G

解决方法

如果不是对“无限技能”的期望,这可能是一个相对简单的查询。也就是说,这里有一些东西会让你得到你想要的结果。

在以 WHERE zz.skill IN 开头的行的中间替换所需的技能期望:

SELECT DISTINCT zz.`name`
  FROM (SELECT DISTINCT uu.`name`,TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uu.`skill`,'',num.`idx`),-1)) as `skill`
          FROM `User` uu CROSS JOIN
               (SELECT (h*100+t*10+u+1) as `idx`
                  FROM (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,(SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,(SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c) num) zz
 WHERE zz.`skill` IN (SELECT DISTINCT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(''skill A,skill B,skill C'',-1)) as `skill`
                        FROM (SELECT (h*100+t*10+u+1) as `idx`
                                FROM (SELECT 0 h UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,(SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c) num
                       HAVING `skill` <> '''')
 ORDER BY zz.`name`;

注意事项:

  1. 技术上在这里您没有无限的技能选择。每个记录最多可以有 1,000 个。如果您需要更多,则需要扩展丑陋的 CROSS JOIN 数字生成器。
  2. 这不是最节省内存的设计。不建议一次运行数万条记录。

源数据:

DROP TABLE IF EXISTS `User`;
CREATE TABLE IF NOT EXISTS `User` (
    `id`        int(11)       UNSIGNED NOT NULL,`name`      varchar(40)            NOT NULL    DEFAULT '''',`skill`     varchar(256)           NOT NULL    DEFAULT ''''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `User` (`id`,`name`,`skill`)
VALUES (1,''Person A'',''skill A,skill C''),(2,''Person B'',''skill B,skill C,skill D''),(3,''Person C'',''skill C,(4,''Person D'',''skill E,skill F''),(5,''Person E'',skill E''),(6,''Person F'',(7,''Person G'',''skill G,skill H,skill X,skill Y,skill Z'');
,

解决这个问题的关键是将每个技能拆分成单独的行,不需要硬编码。但是,无论使用什么方法,首先必须要有足够大的数字表。有很多方法可以像这样创建它

create table bignum as 
select @rn:=@rn+1 rn
  from information_schema.COLUMNS t1,(select @rn:=0) t2
 limit 100;

然后你可以这样做

DROP TABLE IF EXISTS `User`;
CREATE TABLE IF NOT EXISTS `User` (
    `id`        int(11)       UNSIGNED NOT NULL,skill Z'');

select t1.*,trim(SUBSTRING_INDEX(SUBSTRING_INDEX(t1.`skill`,t2.rn),-1))
  from user t1,bignum t2
 where length(t1.skill) - length(replace(t1.skill,'''')) + 1 >= t2.rn
 order by t1.id
;

至于其他,我相信你可以自己做。

,

首先,您应该修复您的数据模型!在一个字符串中存储多个值只是一种糟糕的数据存储方式。因为许多的原因。那应该是你努力的方向。

因为你正在寻找any匹配,你有点幸运,因为你可以使用正则表达式:

select u.*
from user u join
     jobs j
     on u.skill regexp replace(j.skill,''|'');

注意:这里假设技能列表不包含任何特殊的正则表达式字符。它还假设技能不会“重叠”,因此您的一项技能与另一项不匹配。问题的一个例子可能是 SQLMySQL。这可以通过使正则表达式更复杂一些来解决。这些问题可以通过修改正则表达式来解决,但我不知道是否需要复杂化。

关于sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列sql按逗号拆分列为多列的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串、mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现、mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享、Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值的相关信息,请在本站寻找。

本文标签: