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