基于分隔符的分区字符串

时间:2019-08-28 04:11:32

标签: sql sql-server sql-server-2016

存储在nvarchar字段中的字符串,例如'CA:No:1250.00000',并希望基于分隔符对字符串进行分区,例如 第1栏应显示CA(州) 第2栏应显示“否”(可恢复,不可恢复) 第3栏应显示1250.00000(税率)

我尝试了下面的代码,但在所有情况下都无法正常工作。如果Recov设置为是

SELECT
    SUBSTRING(SDESC, 0, CHARINDEX(':', SDESC)) AS STATENAME,
    SUBSTRING(SUBSTRING(SDESC, CHARINDEX(':', SDESC) + 1, LEN(SDESC)), 0, CHARINDEX(':', SUBSTRING(SDESC, CHARINDEX(':', SDESC) +
    1, LEN(SDESC)))) RECOV,
    SUBSTRING(SDESC, CHARINDEX(':', SDESC) + 4, LEN(SDESC)) AS REMANING
FROM
    LOOKUP
WHERE
    SLISTNAME = 'StateTax'

预期结果是基于定界符的3个不同的列:发生

3 个答案:

答案 0 :(得分:1)

您可以尝试一下。由于您的字符串格式相同,因此字符串中始终有2个:。因此,我们将使用REVERSE来获取字符串的最后一部分,因为中间部分的长度可变,即i,e; 3的{​​{1}}和YES的{​​{1}}。

2

结果:-

NO

答案 1 :(得分:1)

由于字符串的前2个部分是相对静态的,所以可以这样做:

select
left(sdesc,2) col1,
replace(substring(sdesc,4,3),':','') col2,
replace(stuff(sdesc, 1,6, ''),':','') col3
from your_table

答案 2 :(得分:0)

select substring(SDESC, 1, charindex(":", SDESC) - 1) --should give you the state,
select substring(SDESC, 4, charindex(":", SDESC) - 1) --should give you the NO, etc.
select right(SDESC, charindex(":", reverse(SDESC)) - 1) --should give you the rest.