显示来自text..if分隔的值;仅显示第一个值

时间:2016-09-08 11:48:51

标签: sql sql-server sql-server-2012

我有值表。这是因为;分隔。值可以为空,1个数字和以分号分隔的数字(如图所示)

+-----------+
|   room    |
+-----------+
|    64     |
+-----------+
|   60008   |
+-----------+
|           |
+-----------+
| 127;50047 |
+-----------+

我有这个代码。子串正在寻找;并显示第一个价值。它仅在值分隔的位置起作用。那么我怎样才能改变它,它会显示第一个值;和单值也。所以从下面的表格我会得到64,60008, ,127

SELECT  
T0.U_Scid as 'id',
T3.U_Boarding as 'start',
T3.U_Boarding as 'end',

SUBSTRING(T5.U_Partner, 0, CHARINDEX(';', T5.U_Partner)) AS 'room_id',

CASE WHEN datalength(T5.U_Partner)=0 THEN '9999' ELSE T5.U_Partner END  AS 'room_id' , 
CASE WHEN datalength(T5.U_Partner) > 4 THEN T5.U_Partner ELSE '9999' END AS 'partners_id' ,

这只是奖金问题。 CASE正在寻找值的长度,如果值超过4(600008)写入room_id 9999并将600008保存到partners_id。如果为空,则将9999写入room_id。

如何使它一起工作?。从T_Partner获取值...将它保存到临时表T1.TempRoom(我想)..所以T1.TempRoom(填充数字,如64 ,,,60008,127)然后CASE正在检查T1.TempRoom的值并将其保存到room_id和partners_id中。

我是对的吗?

1 个答案:

答案 0 :(得分:2)

这是一个简单的方法:

SUBSTRING(T5.U_Partner, 1, CHARINDEX(';', T5.U_Partner + ';')) AS room_id,

即,将分号连接到CHARINDEX()的参数。这样可以防止发生任何错误。

此外,SUBSTRING()的索引从1开始,而不是从0开始。

并且,不要使用单引号作为列名。仅将它们用于字符串和日期文字。

编辑:

您始终可以使用详细格式:

(CASE WHEN T5.U_Partner LIKE '%;%'
      THEN SUBSTRING(T5.U_Partner, 1, CHARINDEX(';', T5.U_Partner + ';'))
      ELSE T5.U_Partner
 END) AS room_id