SQL函数将某个字段合并在一起的操作

最近遇到需要将关联表中的某个字段全部查询出来并且重新组合为一个字段,这个时候普通的连接查询就满足不了需求了,需要用到SQL函数来完成:

ALTER function dbo.getResCodesByOwnerId(@OwnerId INT)
returns nvarchar(2000)
as
begin
DECLARE @codes VARCHAR(2000)
SET @codes=''
select @codes=stuff((select ','+residence_code from crm_owner co left join crm_owner_residence cor on co.id=cor.owner_id where co.id=@OwnerId for xml path('')),1,1,'')
return @codes
END

拿id = 2 的数据来做测试,得到结果:

select (数据库名).getResCodesByOwnerId(fr.owner_id) as room_code
from t1 fr left join t2 frd on fr.owner_id=frd.owner_id

结果:

1101010105,11GU002,1101010104

补充:SQL STUFF函数 拼接字符串

今日看到一篇文章,是关于和并列的,也研究了下,还是不错的

要这种效果。

create table tb(idint, value varchar(10))
insert into tbvalues(1,'aa')
insert into tbvalues(1,'bb')
insert into tbvalues(2,'aaa')
insert into tbvalues(2,'bbb')
insert into tbvalues(2,'ccc')
go

/*     stuff(param1, startIndex, length, param2)

说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/

SELECT id,
           value = stuff
             ((SELECT   ',' + value
               FROM     tb AS t
               WHERE   t .id = tb.id FOR xml path('')), 1, 1, '')
FROM     tb
GROUP BY id

这样即可。

收集的资料

/*
标题:按某字段合并字符串之一(简单合并)
作者:(十八年风雨,守得冰山雪莲花开)
地点:广东深圳 

描述:将如下形式的数据按id字段合并value字段。
id  value
----- ------
1   aa
1   bb
2   aaa
2   bbb
2   ccc
需要得到结果:
id   value
------ -----------
1   aa,bb
2   aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go 

create function dbo.f_str(@id varchar(10)) returns varchar(1000)
as
begin
 declare @str varchar(1000)
 select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
 return @str
end
go 

--调用函数
select id , value = dbo.f_str(id) from tb group by id 

drop function dbo.f_str
drop table tb  

--2、sql2005中的方法
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by id
drop table tb 

--3、使用游标合并数据
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
declare @t table(id int,value varchar(100))--定义结果集表变量
--定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s=''
while @@FETCH_STATUS = 0
begin
  if @id = @id_old
    select @s = @s + ',' + cast(@value as varchar)
  else
   begin
    insert @t values(@id_old , stuff(@s,1,1,''))
    select @s = ',' + cast(@value as varchar) , @id_old = @id
   end
  fetch my_cursor into @id , @value
END
insert @t values(@id_old , stuff(@s,1,1,''))
close my_cursor
deallocate my_cursor 

select * from @t
drop table tb 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • mysql中合并两个字段的方法分享

    例如:select (a+b) as c from 表 类型也一致都是varchar型的,可就是显示不正确. 直到concat() MySQL中concat函数 下面通过一个例子介绍MySQL中的concat函数的使用方法,比如select concat('11','22','33'). MySQL中concat函数 使用方法: CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制字符串,则

  • MySQL Union合并查询数据及表别名、字段别名用法分析

    本文实例讲述了MySQL Union合并查询数据及表别名.字段别名用法.分享给大家供大家参考,具体如下: union关键字 SELECT s_id, f_name, f_price FROM fruits WHERE f_price < 9.0 UNION ALL SELECT s_id, f_name, f_price FROM fruits WHERE s_id IN(101,103); 为表取别名 SELECT * from orders AS o WHERE o.o_num = 3000

  • Mysql合并结果接横向拼接字段的实现步骤

    前言 近日在做一个报表功能里面有一个这样的需求是统计各部门在某一月入职和离职的人数 我的步骤 先查出入职的人数 SELECT dept ,COUNT(1) rcNumber FROM 员工表 WHERE ( 入职时间 != '' OR 入职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09' GROUP BY 部门ID ORDER BY 部门名称 查询记录 在查询出离职的人数sql: SELECT dept ,COUNT(1) rcN

  • mysql 列转行,合并字段的方法(必看)

    数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 as 语文---别名作为列名 SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CASE WHEN course='数学' THEN score END ) AS 数学, MAX( CASE WHEN cour

  • sql server 中合并某个字段值的实例

    有表如下: 如何获得如下结果: 解法 使用xml转换 代码如下: 复制代码 代码如下: CREATE TABLE body ( ID int, BODY nvarchar(20) ) go INSERT INTO body VALUES(1,'aaaa') INSERT INTO body VALUES(2,'bbbb') INSERT INTO body VALUES(1,'cccccc') INSERT INTO body VALUES(3,'ddddd') go SELECT * FROM

  • mysql单字段多值分割和合并的处理方法

    多个值合并展示 现在我们有如图一到图二的需求 怎么做? 如下sql: SELECT id,GROUP_CONCAT(DISTINCT str) as str from test GROUP BY id 相关知识点 GROUP_CONCAT GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 多个值拆分展示 现在我们的需求和第一个例子相反 由图三 到图四 这里就稍微复杂了,首先对于str提前做了如图的

  • 分组字符合并SQL语句 按某字段合并字符串之一(简单合并)

    标题:按某字段合并字符串之一(简单合并) 描述:将如下形式的数据按id字段合并value字段. id    value ----- ------ 1     aa 1     bb 2     aaa 2     bbb 2     ccc 需要得到结果: id     value ------ ----------- 1      aa,bb 2      aaa,bbb,ccc 即:group by id, 求 value 的和(字符串相加) 1.sql2000中只能用自定义的函数解决 cr

  • SQL函数将某个字段合并在一起的操作

    最近遇到需要将关联表中的某个字段全部查询出来并且重新组合为一个字段,这个时候普通的连接查询就满足不了需求了,需要用到SQL函数来完成: ALTER function dbo.getResCodesByOwnerId(@OwnerId INT) returns nvarchar(2000) as begin DECLARE @codes VARCHAR(2000) SET @codes='' select @codes=stuff((select ','+residence_code from c

  • sql 函数大全 比较常用的一些函数整理第1/2页

    select语句中只能使用sql函数对字段进行操作(链接sql server),select 字段1 from 表1 where 字段1.IndexOf("云")=1;这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了.left()是sql函数.select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据.字符串和表达式执行不同的运算.此类函数作用于CHAR.VARCHAR. BINARY. 和

  • oracle 合并查询 事务 sql函数小知识学习

    表查询: 合并查询:使用union关键字,可将满足条件的重复行去掉. 复制代码 代码如下: select ename,sal,job from emp where sal > 2500 union select ename,sal,job from emp where job = 'MANAGER'; 而union all用法和union相似,但是不会取消重复行. intersect 用来取两个结果的交集. minus用来取两个结果的差集. 使员工scott的岗位,工资,补助与SMITH员工一样

  • 使用SQL将多行记录合并成一行实例代码

    目录 前言 1.数据处理前 2,结果数据展示 3,hive处理方式 4,MySQL处理方式 总结 前言 我们在数据开发的过程中,经常会遇到这样的需求,就是将多行合并为一行,并且用特定字符隔开. 1.数据处理前 2,结果数据展示 3,hive处理方式 在hive里面,用concat_ws函数处理 格式: concat_ws(‘分隔符’,collect_set/collect_list(字段)) 参数释义: concat_ws:多行合并一行函数 collect_set:合成数组,数据已去重 coll

  • 在SQL中对同一个字段不同值,进行数据统计操作

    应用场景: 需要根据印章的不同状态,统计不同状态下印章数量. 刚开始百度,确实写搜到了不同的答案,但只能怪自己对sql语法解读不够,还是没写出来,导致写出了下面错误的写法. select b.corporateOrgName, b.corporateOrgGuid companyId, count(case when bc.ftype not in(1,2) then 1 else 0 end ) total, count(case when bc.ftype in(3,4,5) then 1

  • SQL SERVER实现连接与合并查询

    创建测试表MyStudentInfo CREATE table MyStudentInfo ( Id int not null primary key, Name varchar(16), Age int, Gender varchar(2), Phone varchar(16), Address varchar(50), GradeId int ) 联合插入多条数据 INSERT INTO MyStudentInfo SELECT 1,'张三',20,'1','15801258912','上海

  • Java通过MySQL的加解密函数实现敏感字段存储

    java通过mysql的加解密函数实现敏感字段存储 1.AES加解密工具类: public class AESUtils { public static String encrypt(String password, String strKey) { try { SecretKey key = generateMySQLAESKey(strKey,"ASCII"); Cipher cipher = Cipher.getInstance("AES"); cipher.

  • SQL函数Group_concat的用法及说明

    目录 SQL函数Group_concat的用法 完整语法如下 Group_concat函数长度问题 解决的方式有三个 总结 SQL函数Group_concat的用法 完整语法如下 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) SELECT * FROM testgroup 表结构与数据如上 现在的需求就是每个id为一行 在前台每行显示该id所有分数 group_concat 上场!!! SEL

  • PGSQL查询最近N天的数据及SQL语句实现替换字段内容

    目录 1.用SQL查询最近N天的数据 2.用SQL语句实现替换字段里的内容 3.SQL将查询结果赋值 4.SQL查询字段内容为 NULL值时候赋值 总结 1.用SQL查询最近N天的数据 思路:先获取当前的时间,然后更具当前时间去减去对应的天数,就可以得到需要的天数了.然后用这些天数作为条件,然后即可查询出需要多少天的数据了. -- 获取当前时间 SELECT CURRENT_TIMESTAMP; -- 或 SELECT now(); select CURRENT_TIMESTAMP :: DAT

随机推荐