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)使用REPLICATE和CHARINDEX时选择大小写:
复制:将重复给定字符,直到达到函数中指定的所需计数
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;