用,号分割的编号串字段,如何实现类似left join效果

chilli6519 2017-09-27 09:29:44
有两个表,其中一个项目表 table1 ,包含有字段 编号,名称,如:
id title
1 afadfaf
2 xvxz
3 uiiwiwiwi
4 77a7da
5 adq344qeq

另外一个表 table2 ,有字段 id , title , table1ids
其中字段 table1ids 是表一 table1 的 字段 id 值组成的字符串,如:1,4,5 , 注意这是可变的
table2 的内容类似
id , title , table1ids
1 1111 1,4,5

现在希望通过table2 的id值 和 table1结合检索出一个复合内容, 在完整的table1的内容字段后面增加一个字段 iflag, 如果对应编号在table2的 table1ids 中,iflag 就赋值为 1 ,否则为 0
结果是这样的:
id title iflag
1 afadfaf 1
2 xvxz 0
3 uiiwiwiwi 0
4 77a7da 1
5 adq344qeq 1

谢谢
...全文
325 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
顺势而为1 2017-09-28
  • 打赏
  • 举报
回复
如果mysql 不支持 case when , 就用


Select a.id,a.title,1 as iFlag
					From #Tmp_Data a
						 Join #Tmp_Data1 b on charindex(cast(a.id as varchar),b.IDS)>0

					union 

					Select a.id,a.title,0 as iFlag
					From #Tmp_Data a
						 Join #Tmp_Data1 b on charindex(cast(a.id as varchar),b.IDS)=0

顺势而为1 2017-09-28
  • 打赏
  • 举报
回复


if object_id('tempdb..#Tmp_Data') is not null
           drop table #Tmp_Data

CREATE TABLE #Tmp_Data(
        id int,
		title VARCHAR(50))

INSERT INTO #Tmp_Data
SELECT 1,'afafaa' UNION 
SELECT 2,'dsaf'UNION 
SELECT 3,'dsssaf'UNION 
SELECT 4,'qqwe'UNION 
SELECT 5,'ewrd'

if object_id('tempdb..#Tmp_Data1') is not null
           drop table #Tmp_Data1

CREATE TABLE #Tmp_Data1(id int,title VARCHAR(50),IDs VARCHAR(50))
INSERT INTO #Tmp_Data1
VALUES  ( 1, '111', '1,4,5')


Select a.id,Title,case when b.id is null then 0 else 1 end as iFlag
From #Tmp_Data a
     Left Join (
					Select a.id
					From #Tmp_Data a
						 Join #Tmp_Data1 b on charindex(cast(a.id as varchar),b.IDS)>0
				) b on a.id=b.id


id          Title                                              iFlag
----------- -------------------------------------------------- -----------
1           afafaa                                             1
2           dsaf                                               0
3           dsssaf                                             0
4           qqwe                                               1
5           ewrd                                               1

(5 row(s) affected)





zbdzjx 2017-09-28
  • 打赏
  • 举报
回复
select id, title
, isnull((select 1 from table2 where ','+table1ids+',' like '%,'+convert(varchar,table1.id)+',%'), 0) iflag
from table1
OwenZeng_DBA 2017-09-27
  • 打赏
  • 举报
回复
引用 4 楼 chilli6519的回复:
[quote=引用 3 楼 z10843087 的回复:] 效果如下图。手机回复太恼火了,,好像忘记发函数的定义了
希望能用动态sql语句,不用函数和存储过程,辛苦[/quote] 不过不用函数,也没发处理字符串中的分号。还是必须得用啊。
OwenZeng_DBA 2017-09-27
  • 打赏
  • 举报
回复
效果如下图。手机回复太恼火了,,好像忘记发函数的定义了
OwenZeng_DBA 2017-09-27
  • 打赏
  • 举报
回复
CREATE TABLE #table1(id INt,title VARCHAR(50))
INSERT INTO #table1 (id,
title)

SELECT 1,'afafaa'
UNION ALL

SELECT 2,'dsaf'
UNION ALL

SELECT 3,'dsssaf'
UNION ALL

SELECT 4,'qqwe'
UNION ALL

SELECT 51,'ewrd'
CREATE TABLE #table2(id INT,title VARCHAR(50),t1ids VARCHAR(50))
INSERT INTO #table2
( id, title, t1ids )
VALUES ( 1, -- id - int
'111', -- title - varchar(50)
'1,4,5' -- t1ids - int
)
chilli6519 2017-09-27
  • 打赏
  • 举报
回复
引用 5 楼 z10843087 的回复:
把完整的发博客上了,,直接看博客把。用的函数。勉强用把。现在这个没有审核只能手机上回答, http://www.cnblogs.com/OwenZeng/p/7604250.html
谢谢,我的数据库是mysql的,语法上好像有些问题 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0) WHEN 0 THEN 0 ELSE 1 end) AS iflag FROM t_school_cls_service t1 LEFT JOIN ( ' at line 1 另外是否可以直接用动态sql语句解决? 谢谢
OwenZeng_DBA 2017-09-27
  • 打赏
  • 举报
回复
把完整的发博客上了,,直接看博客把。用的函数。勉强用把。现在这个没有审核只能手机上回答, http://www.cnblogs.com/OwenZeng/p/7604250.html
chilli6519 2017-09-27
  • 打赏
  • 举报
回复
引用 3 楼 z10843087 的回复:
效果如下图。手机回复太恼火了,,好像忘记发函数的定义了
希望能用动态sql语句,不用函数和存储过程,辛苦
OwenZeng_DBA 2017-09-27
  • 打赏
  • 举报
回复
SELECT t1.*,(CASE ISNULL(t.VALUE,0) WHEN 0 THEN 0 ELSE 1 end)AS iflag FROM #table1 t1 LEFT JOIN (
SELECT a.*,b.Value
FROM #table2 a
CROSS APPLY(SELECT Value FROM dbo.fn_split(a.t1ids,',',1)) b)AS t
ON t1.id = t.value

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧