我有值表。这是因为;分隔。值可以为空,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中。
我是对的吗?
答案 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