在这里,我们将给大家分享关于sql–使用逗号分隔符将单列数据拆分为SSIS中的多个列的知识,让您更了解sql按逗号拆分列为多列的本质,同时也会涉及到如何更有效地asp.net–如何在SQLServer
在这里,我们将给大家分享关于sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列的知识,让您更了解sql按逗号拆分列为多列的本质,同时也会涉及到如何更有效地asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串、mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现、mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享、Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值的内容。
本文目录一览:- sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列(sql按逗号拆分列为多列)
- asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串
- mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现
- mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享
- Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值
sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列(sql按逗号拆分列为多列)
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存储过程中使用逗号分隔(拆分)字符串
例如,选择的值是星期一,星期二,星期四,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 对使用逗号分隔的字符串 转换为数据表的另类方法实现
转自: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 将逗号分隔的一列数据转换为多列数据的方法分享
转自: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 个表的值使用逗号,使用逗号分隔符匹配相同的值?
我继续之前程序员的一个项目的工作,查询有问题,因为字符串数据类型用逗号分隔,必须在查询中。
是否可以从 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,000 个。如果您需要更多,则需要扩展丑陋的
CROSS JOIN
数字生成器。 - 这不是最节省内存的设计。不建议一次运行数万条记录。
源数据:
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,''|'');
注意:这里假设技能列表不包含任何特殊的正则表达式字符。它还假设技能不会“重叠”,因此您的一项技能与另一项不匹配。问题的一个例子可能是 SQL
和 MySQL
。这可以通过使正则表达式更复杂一些来解决。这些问题可以通过修改正则表达式来解决,但我不知道是否需要复杂化。
关于sql – 使用逗号分隔符将单列数据拆分为SSIS中的多个列和sql按逗号拆分列为多列的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net – 如何在SQL Server存储过程中使用逗号分隔(拆分)字符串、mssql sqlserver sql 对使用逗号分隔的字符串 转换为数据表的另类方法实现、mssql sqlserver 将逗号分隔的一列数据转换为多列数据的方法分享、Mysql 查询 2 个表的值使用逗号,使用逗号分隔符匹配相同的值的相关信息,请在本站寻找。
本文标签: