Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在第一次催眠前填充零,删除空格并添加BA和IN_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 在第一次催眠前填充零,删除空格并添加BA和IN

Sql 在第一次催眠前填充零,删除空格并添加BA和IN,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有如下数据 98-45.3A-22 104-44.0A-23 00983-29.1-22 01757-42.5A-22 04968-37.3A2-23 输出在SQL Server中查找以下输出 00098-BA45.3A-IN-22 00104-BA44.0A-IN-23 00983-BA29.1-IN-22 01757-BA42.5A-IN-22 04968-BA37.3A2-IN-23 试试这个 DECLARE @String VARCHAR(100) = '98-45.3A-22'

我有如下数据

98-45.3A-22
104-44.0A-23
00983-29.1-22
01757-42.5A-22
04968-37.3A2-23
输出在SQL Server中查找以下输出

00098-BA45.3A-IN-22
00104-BA44.0A-IN-23
00983-BA29.1-IN-22
01757-BA42.5A-IN-22
04968-BA37.3A2-IN-23
试试这个

DECLARE @String VARCHAR(100) = '98-45.3A-22'
SELECT  ISNULL(REPLICATE('0',6 - CHARINDEX('-',@String)),'')        -- Add leading Zeros
        + STUFF(
                STUFF(@String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                1,'-IN')    --  Add 'IN'
如果我在第一个连字符之前有超过6位的数字,并希望删除前导零,使其成为6位数字,该怎么办

DECLARE @String VARCHAR(100) = '0000098-45.3A-22'
SELECT  CASE WHEN CHARINDEX('-',@String) <= 6 
            THEN ISNULL(REPLICATE('0',6 - CHARINDEX('-',@String)),'')        -- Add leading Zeros
                + STUFF(
                        STUFF(  @String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                        CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                        1,'-IN')    --  Add 'IN'
            ELSE STUFF(
                        STUFF(
                                STUFF(@String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                                CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                                1,'-IN'),    --  Add 'IN'
                        1, CHARINDEX('-',@String) - 6, ''       -- remove extra leading Zeros
                        )
        END
DECLARE@String VARCHAR(100)='0000098-45.3A-22'

当CHARINDEX('-',@String)使用REPLICATECHARINDEX时选择大小写:

复制:将重复给定字符,直到达到函数中指定的所需计数

CharIndex:查找任何字符的第一个匹配项

Declare @Data AS VARCHAR(50)='98-45.3A-22'
SELECT REPLICATE('0',6-CHARINDEX('-',@Data)) + @Data    

SELECT 
    SUBSTRING
    (
        (REPLICATE('0',6-CHARINDEX('-',@Data)) +@Data)
        ,0
        ,6
    )
    +'-'+'BA'+  CAST('<x>' + REPLACE(@Data,'-','</x><x>') + '</x>' AS XML).value('/x[2]','varchar(max)')
    +'-'+ 'IN'+ '-' + CAST('<x>' + REPLACE(@Data,'-','</x><x>') + '</x>' AS XML).value('/x[3]','varchar(max)')
将@Data声明为VARCHAR(50)='98-45.3A-22'
选择复制('0',6-CHARINDEX('-',@Data))+@Data
挑选
子串
(
(复制('0',6-CHARINDEX('-',@Data))+@Data)
,0
6.
)
+'-'+'BA'+CAST(''+REPLACE(@Data'-','')+''作为XML)。值('/x[2]','varchar(max)'))
+“+”-“+”中的“-”+”+CAST(“+REPLACE”(@Data,“-”,“)+”作为XML)。值(“/x[3]”,“/varchar(max)”)

假设格式一致(例如,始终以“-”+2个字符结尾……)


在SQL中一直执行这种字符串操作并不理想。您可以将其转移到表示层,或者将预格式化的值存储在数据库中,以节省每次的成本。

我拆分了部分以处理复杂的数据模板。即使使用非破折号2位数的尾翼,也应该可以:

WITH Src AS
(
    SELECT * FROM (VALUES
    ('98-45.3A-22'),
    ('104-44.0A-23'),
    ('00983-29.1-22'),
    ('01757-42.5A-22'),
    ('04968-37.3A2-23')
    ) T(X)
), Parts AS
(
    SELECT *,
    RIGHT('00000'+SUBSTRING(X, 1, CHARINDEX('-',X, 1)-1),5) Front,
    'BA'+SUBSTRING(X, CHARINDEX('-',X, 1)+1, 2) BA,
    SUBSTRING(X, PATINDEX('%.%',X), LEN(X)-CHARINDEX('-', REVERSE(X), 1)-PATINDEX('%.%',X)+1)  P,
    SUBSTRING(X, LEN(X)-CHARINDEX('-', REVERSE(X), 1)+1, LEN(X)) En
    FROM Src
)
SELECT Front+'-'+BA+P+'-IN'+En
FROM Parts
它返回:

00098-BA45.3A-IN-22
00104-BA44.0A-IN-23
00983-BA29.1-IN-22
01757-BA42.5A-IN-22
04968-BA37.3A2-IN-23

通过使用
PARSENAME()
的另一种方式,您可以使用以下查询:

 WITH t AS (
SELECT 
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 3) AS p1,
    REPLACE(PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 2), '@@@', '.') AS p2,
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 1) AS p3
FROM yourTable)
SELECT RIGHT('00000' + p1, 5) + '-BA' + p2 + '-IN-' + p3
FROM t;

关于
BA
中的
呢?@Jatin Patel,这很有效,但我正在寻找BA和IN来添加到右侧的列中,@sagi我错过了
BA
中,现在包括。@Jatin Patel:如果我在第一次催眠之前有超过6位的数字,并删除剩余的零,使其与您提供的上述代码一起重新成为6位数字,该怎么办?@Vinay,请检查我是否添加了另一个解决方案。我们是否保证最后一段始终是一个连字符,后跟正好2位数字?
 WITH t AS (
SELECT 
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 3) AS p1,
    REPLACE(PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 2), '@@@', '.') AS p2,
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 1) AS p3
FROM yourTable)
SELECT RIGHT('00000' + p1, 5) + '-BA' + p2 + '-IN-' + p3
FROM t;