繁体   English   中英

带条件的分隔符

[英]Delimiter with a condition

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

1)在第一条记录中:'3.001.1.16',在第二个位置有一个分隔符(.)并且存在连续的3个数字(001),所以我的输出是001。
.
2)在第二条记录'3.1.006.4.7'中,第二个位置有一个分隔符,但我们没有三个连续的数字,所以我们检查第四个位置,有一个分隔符,并且存在连续的三个数字,所以输出是 006 。
.
3) 没有 (.) 分隔符,因此输出 = 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

假设来自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_CONVERT to int将验证这 3 个字符是数字

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

它允许您拆分字符串并作为结果获得表格。

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
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM