求帮忙,有没有简单点的语句能实现(不要函数)

mfmyy11 2016-07-06 09:57:43
某个字段如果=1 则取得字符串‘1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水
1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水’的‘欠费拆表‘(’1|欠费拆表’);如果是2取得‘空 房’(‘2|空 房’),字符串中的中文是可以随时被改动的(值可以随时被变化的)
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfmyy11 2016-07-12
  • 打赏
  • 举报
回复
谢谢了,要是写函数,存储过程,这样应该更方面点 DECLARE @sql VARCHAR(2000) , @tsql NVARCHAR(MAX) , @split VARCHAR(100); SET @sql = ( SELECT ValueList FROM dbo.CustomerFields WHERE FieldName = 'MeterAddication1Flag' );--ValueList='1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水' --保存的字符 SET @split = CHAR(10); --分隔符 SELECT @tsql = 'SELECT substring (a.状态原因,1,1) as id,a.状态原因 FROM' + '(select ''' + REPLACE(@sql, @split, ''' AS 状态原因 union select ''') + ''') as a'; --select @tsql='SELECT substring(a.a1, 1, 1), a.a1 FROM '+'(SELECT '''+replace(@sql,@split,''' as a1 union all select ''')+''') as a' PRINT @tsql; EXEC(@tsql); id 状态原因 1 1|欠费拆表 2 2|空 房 3 3|正常使用 4 4|水表报停 5 5|临时用水
tcmakebest 2016-07-07
  • 打赏
  • 举报
回复
写一个函数是最好的办法,还挑来挑去
唐诗三百首 2016-07-06
  • 打赏
  • 举报
回复
用临时表总可以吧, 每次连线成功后,创建临时表, 从表中取出此字符串,拆分为行插入临时表..
zbdzjx 2016-07-06
  • 打赏
  • 举报
回复
引用 楼主 mfmyy11 的回复:
某个字段如果=1 则取得字符串‘1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水 1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水’的‘欠费拆表‘(’1|欠费拆表’);如果是2取得‘空 房’(‘2|空 房’),字符串中的中文是可以随时被改动的(值可以随时被变化的)
怎么‘1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水 1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水’里面内会重复??
mfmyy11 2016-07-06
  • 打赏
  • 举报
回复
谢谢,但是不能这样做,这个字符串是存在某个表的字段中(可以随时更改),所以没办法按你那样去实现,还有做数据库改动的话,毕竟是公司运行的数据库,个人还是不允许乱动
唐诗三百首 2016-07-06
  • 打赏
  • 举报
回复
建议新建一个配置表: ID, 属性值 存储5行记录: 1|欠费拆表 2|空 房 3|正常使用 4|水表报停 5|临时用水 查询时关联此配置表即可: select * from [主表] a inner join 配置表 b on a.某字段=b.ID
道素 2016-07-06
  • 打赏
  • 举报
回复
假设每组之间都用用两个空格分开,先按照这个拆分多行,再取出其中数字值,然后考虑本身内容包含空格的 根据数字的值搜索,如果有多行(内容有空格,如空 房)在合并为一个

 DECLARE @s NVARCHAR(MAX)
 DECLARE @fid INT=1
 ;WITH a(s) AS (
    SELECT  N'1|欠费拆表  2|空    房  3|正常使用  4|水表报停  5|临时用水'
 )
 SELECT replace(( --合并
 SELECT n.ss+'-' FROM (
    SELECT s,CONVERT(XML,'<r><n>'+REPLACE(a.s,'  ','</n><n>')+'</n></r>') AS x FROM a
 ) t
 CROSS APPLY (
 	SELECT SUM(CASE WHEN ISNUMERIC( LEFT(a.ss,1))=1 THEN 1 ELSE 0 END)OVER( order by a.seq ) AS g
 	       ,convert(int,MAX(CASE WHEN ISNUMERIC( LEFT(a.ss,1))=1 THEN LEFT(a.ss,1) ELSE '' END)OVER( order by a.seq )) AS id
 	       ,a.* FROM (
 	SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) AS seq, b.value('.','NVARCHAR(500)') AS ss FROM t.x.nodes('r/n') s(b)
 	) a
 ) n
 
 WHERE n.id=2
 FOR XML PATH('')
),'-',' ')

22,209

社区成员

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

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