搜索两个字符串之间的公共前缀
Search for a common prefix between two strings
我有一个存储过程:
ALTER PROCEDURE [dbo].[traxs_Paybook_Data_Validate]
@session_id varchar(30)
@paybook_start_number varchar(30)
@paybook_end_number varchar(30)
AS
UPDATE traxs_temp..__PaybookImport SET
/* BEGIN CHANGE */
prefix = null,
start_number = CAST(@paybook_start_number AS int),
end_number = CAST(@paybook_end_number AS int)
/* END CHANGE */
WHERE
session_id = @session_id
值如下:
@paybook_start_number
= 100
@paybook_end_number
= 200
现在工资簿号码可以有前缀,即:
@paybook_start_number
= ABC100
@paybook_end_number
= ABC200
前缀并不总是相同的,其长度也不相同。如果有,我需要找到前缀,将其存储到 prefix
中,并在投射之前将其从工资簿号码中删除。
谢谢
您需要一个从输入字符串中提取 Number/Numeric 值的函数和一个从输入字符串中提取字母的函数。
提取数字的函数
CREATE FUNCTION dbo.fn_Extract_Numbers
(
@string NVARCHAR(100)
)
RETURNS INT
AS
BEGIN
DECLARE @int_Value INT;
SELECT @int_Value = LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1)
FROM (
SELECT subsrt = SUBSTRING(@string, pos, LEN(@string))
FROM (
SELECT @string AS string , PATINDEX('%[0-9]%', @string) AS Pos
) d
) t
RETURN @int_Value;
END
提取字母的函数
CREATE FUNCTION dbo.fn_Extract_Alphabets
(
@string NVARCHAR(100)
)
RETURNS NVARCHAR(100)
AS
BEGIN
DECLARE @Alpha_Value NVARCHAR(100);
SELECT @Alpha_Value = LEFT(subsrt, PATINDEX('%[^a-z]%', subsrt + 't') - 1)
FROM (
SELECT subsrt = SUBSTRING(@string, pos, LEN(@string))
FROM (
SELECT @string AS string , PATINDEX('%[a-z]%', @string) AS Pos
) d
) t
RETURN @Alpha_Value;
END
现在在存储过程中使用这些函数来提取 Alphabet/Prefix 位和数字位并将它们存储在目标列中。
有点像....
ALTER PROCEDURE [dbo].[traxs_Paybook_Data_Validate]
@session_id varchar(30)
@paybook_start_number varchar(30)
@paybook_end_number varchar(30)
AS
DECLARE @Start_Num_Prefix VARCHAR(100);
DECLARE @End_Num_Prefix VARCHAR(100);
DECLARE @Start_Num_Numbers INT;
DECLARE @End_Num_Numbers INT;
SELECT @Start_Num_Prefix = dbo.fn_Extract_Alphabets(@paybook_start_number)
SELECT @End_Num_Prefix = dbo.fn_Extract_Alphabets(@paybook_end_number)
SELECT @Start_Num_Numbers = dbo.fn_Extract_Numbers(@paybook_start_number)
SELECT @End_Num_Numbers = dbo.fn_Extract_Numbers(@paybook_end_number)
..... rest of your procedure and so on....
试试这个:
DECLARE @z VARCHAR(32) = 'ukasd10';
SELECT LEFT(@z, PATINDEX('%[0-9]%', @z) - 1) AS Prefix,REPLACE(SUBSTRING(@z, PATINDEX('%[0-9]%', @z), LEN(@z)), ',', '') AS Digits
并同样使用此逻辑更新列前缀....
谢谢
我有一个存储过程:
ALTER PROCEDURE [dbo].[traxs_Paybook_Data_Validate]
@session_id varchar(30)
@paybook_start_number varchar(30)
@paybook_end_number varchar(30)
AS
UPDATE traxs_temp..__PaybookImport SET
/* BEGIN CHANGE */
prefix = null,
start_number = CAST(@paybook_start_number AS int),
end_number = CAST(@paybook_end_number AS int)
/* END CHANGE */
WHERE
session_id = @session_id
值如下:
@paybook_start_number
= 100
@paybook_end_number
= 200
现在工资簿号码可以有前缀,即:
@paybook_start_number
= ABC100
@paybook_end_number
= ABC200
前缀并不总是相同的,其长度也不相同。如果有,我需要找到前缀,将其存储到 prefix
中,并在投射之前将其从工资簿号码中删除。
谢谢
您需要一个从输入字符串中提取 Number/Numeric 值的函数和一个从输入字符串中提取字母的函数。
提取数字的函数
CREATE FUNCTION dbo.fn_Extract_Numbers
(
@string NVARCHAR(100)
)
RETURNS INT
AS
BEGIN
DECLARE @int_Value INT;
SELECT @int_Value = LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1)
FROM (
SELECT subsrt = SUBSTRING(@string, pos, LEN(@string))
FROM (
SELECT @string AS string , PATINDEX('%[0-9]%', @string) AS Pos
) d
) t
RETURN @int_Value;
END
提取字母的函数
CREATE FUNCTION dbo.fn_Extract_Alphabets
(
@string NVARCHAR(100)
)
RETURNS NVARCHAR(100)
AS
BEGIN
DECLARE @Alpha_Value NVARCHAR(100);
SELECT @Alpha_Value = LEFT(subsrt, PATINDEX('%[^a-z]%', subsrt + 't') - 1)
FROM (
SELECT subsrt = SUBSTRING(@string, pos, LEN(@string))
FROM (
SELECT @string AS string , PATINDEX('%[a-z]%', @string) AS Pos
) d
) t
RETURN @Alpha_Value;
END
现在在存储过程中使用这些函数来提取 Alphabet/Prefix 位和数字位并将它们存储在目标列中。
有点像....
ALTER PROCEDURE [dbo].[traxs_Paybook_Data_Validate]
@session_id varchar(30)
@paybook_start_number varchar(30)
@paybook_end_number varchar(30)
AS
DECLARE @Start_Num_Prefix VARCHAR(100);
DECLARE @End_Num_Prefix VARCHAR(100);
DECLARE @Start_Num_Numbers INT;
DECLARE @End_Num_Numbers INT;
SELECT @Start_Num_Prefix = dbo.fn_Extract_Alphabets(@paybook_start_number)
SELECT @End_Num_Prefix = dbo.fn_Extract_Alphabets(@paybook_end_number)
SELECT @Start_Num_Numbers = dbo.fn_Extract_Numbers(@paybook_start_number)
SELECT @End_Num_Numbers = dbo.fn_Extract_Numbers(@paybook_end_number)
..... rest of your procedure and so on....
试试这个:
DECLARE @z VARCHAR(32) = 'ukasd10';
SELECT LEFT(@z, PATINDEX('%[0-9]%', @z) - 1) AS Prefix,REPLACE(SUBSTRING(@z, PATINDEX('%[0-9]%', @z), LEN(@z)), ',', '') AS Digits
并同样使用此逻辑更新列前缀.... 谢谢