有条件的分隔符

时间:2018-02-22 21:53:55

标签: sql

我在表格中有一个列(MarketID)。 我必须从中获得一个价值。 我必须在第二个位置检查分隔符(。)的出现,并查看分隔符后面是否有连续的三个数字,然后获取该值。如果没有在第四个位置检查是否出现分隔符(。)并查看分隔符后面是否有连续的三个数字,那么得到该值 否则得0。

1)在第一个记录中:' 3.001.1.16',在第二个位置有一个分隔符(。)和连续的3个数字存在(001),所以我的输出将是001.

2)在第二个记录3.1.006.4.7'中,在第二个位置有一个分隔符,但我们没有三个连续的数字,所以我们检查第四个位置并且有一个分隔符和连续三个数字存在,因此输出为006.

3)没有(。)分隔符所以output = 0。

create table dbo.SampleList
(
MarketID varchar(100)
)

insert into dbo.SampleList

select '3.001.1.16'
union all
select '3.1.006.4.7'
union all
select 'D16B000000:21109:4'

select * from dbo.SampleList

3 个答案:

答案 0 :(得分:1)

假设来自dbo的SQL Server,您可以使用CASE语句:

SELECT MarketID, 
       CASE WHEN SUBSTRING(MarketID,2,1) = '.' AND TRY_CONVERT(int,SUBSTRING(MarketID,3,3)) IS NOT NULL THEN SUBSTRING(MarketID,3,3)
            WHEN SUBSTRING(MarketID,4,1) = '.' AND TRY_CONVERT(int,SUBSTRING(MarketID,5,3)) IS NOT NULL THEN SUBSTRING(MarketID,5,3)
            ELSE '0'
       END
FROM #SampleList

TRY_CONVERTint将验证3个字符是数字

答案 1 :(得分:0)

这是使用我几年前创建的函数的解决方案。

它允许您拆分字符串并获取表格。

CREATE FUNCTION [dbo].[splitStringToTable]
(
    @List VARCHAR(MAX) ,
    @Separator VARCHAR(MAX)
)
RETURNS @Results TABLE
(
    ID INT
)
AS      
    BEGIN
        SET @List = @List + ','

        DECLARE @POS INT
        DECLARE @TEMP VARCHAR(8000)

        WHILE (Charindex(@Separator, @List)>0)
        BEGIN
            SET @POS = Charindex(@Separator, @List)
            IF @POS > = 0
            BEGIN
                SET @TEMP = LEFT(@List, @POS-1)
                IF @TEMP <> ''
                    INSERT INTO @Results (ID) VALUES (@TEMP)
                SET @List = Substring(@List, Charindex(@Separator, @List)+len(@Separator), len(@List))
            END
        END
        RETURN
    END
GO

用法:

SELECT *, ISNULL((SELECT TOP 1 ID FROM dbo.[splitStringToStringTable](MarketID, '.') WHERE LEN(ID) = 3), 0) AS Result
    FROM SampleList

答案 2 :(得分:0)

SELECT MarketID,
(CASE WHEN SUBSTRING(MarketID,2,1) = '.' 
      THEN 
        (CASE WHEN SUBSTRING(MarketID,6,1) = '.' THEN SUBSTRING (MarketID,3,3) 
              WHEN SUBSTRING(MarketID,4,1) = '.' THEN 
                                                (CASE WHEN SUBSTRING(MarketID ,8,1)='.' THEN SUBSTRING(MarketID,5,3) ELSE NULL END)ELSE NULL END)

        WHEN MarketID NOT LIKE '%.%' THEN '0'
        ELSE '0'
        END ) AS Output
FROM dbo.SampleList