使用正则表达式从字符串中提取值并存储为新的列值
Pull Value from String using Regular Expressions and store as a new column value
我有一个 SQL 服务器存储过程,我在其中输入值 'Mat',该值的末尾可能包含:(DAY)、(MONTH)、(HR)
如果这个值存在,我希望能够使用正则表达式或其他更容易的方式将其提取出来,并将其存储为另一列。
我目前尝试在 SQL 服务器中使用 LIKE
操作作为新列,但我不相信 SQL 服务器允许这样做。
这是我当前的存储过程:
ALTER PROCEDURE [dbo].[UpdateMaterial_Get_MaterialValues_ByMaterialName]
--UpdateMaterial_Get_MaterialValues_ByMaterialName '2 Inch Discharge Hose (DAY)'
--UpdateMaterial_Get_MaterialValues_ByMaterialName '2 Step Hydroseeding'
@MAT NVARCHAR(255)
AS
BEGIN
SELECT
DEFAULTS.Mat, DEFAULTS.Region, DEFAULTS.MatUnit, DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
@MAT LIKE '(\S+)' AS EquipmentType
FROM
tbl_MaterialDefaults DEFAULTS
RIGHT JOIN
tbl_Client_List_Type_Desc TYPEDESC ON TYPEDESC.Num = DEFAULTS.MatID
WHERE
Mat = @MAT
END
目前我在尝试执行 ALTER
:
时遇到错误
Incorrect syntax near the keyword 'like'.
您可以在@MAT 值可能是什么的代码中看到两个示例。这是我对两者的期望:
对于@MAT 值“2 英寸排放软管(白天)”
Mat Region MatUnit MatWidth MatType EquipmentType
2 Inch Discharge Hose (DAY) Standard Sacramento ACRE 1.00 MATERIAL (DAY)
对于@MAT 值“2 步水力播种”
Mat Region MatUnit MatWidth MatType EquipmentType
2 Step Hydroseeding Standard Sacramento ACRE 1.00 MATERIAL
你可以试试这个:
在您的存储过程中:
DECLARE @ExprStart int = -1,
@ExprEnd int = -1,
@EquipmentType varchar(100) = NULL
IF @Mat LIKE '%(%)%' BEGIN
SET @ExprStart = PATINDEX('%)%', REVERSE(@Mat)),
@ExprEnd = PATINDEX('%(%', REVERSE(@Mat))
SET @EquipmentType = REVERSE(SUBSTRING( @Mat, @ExprStart, @ExprEnd - @ExprStart + 1 ))
END
SELECT
DEFAULTS.Mat,
DEFAULTS.Region,
DEFAULTS.MatUnit,
DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
@EquipmentType AS EquipmentType
FROM
tbl_MaterialDefaults DEFAULTS
RIGHT JOIN
tbl_Client_List_Type_Desc TYPEDESC ON TYPEDESC.Num = DEFAULTS.MatID
WHERE
Mat = @MAT
如果 - 且仅当 - 您在末尾的设备类型之前没有任何括号时,这将起作用。但是我相信你说的是这样。
编辑添加:我看到你已经说过前面的括号可能会发生。我已经调整了代码以适应这一点。我的新版本假设我们从 @Mat
.
中取出最后一组括号
编辑以添加更简单的版本:如果您只需要担心 (HR)
、(DAY)
和 (MONTH)
,我们可以这样做:
-- We don't need any of those declarations or PATINDEXes.
SELECT
DEFAULTS.Mat,
DEFAULTS.Region,
DEFAULTS.MatUnit,
DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
CASE WHEN RTRIM(@Mat) LIKE '%(HR)'
THEN '(HR)'
WHEN RTRIM(@Mat) LIKE '%(DAY)'
THNE '(DAY)'
WHEN RTRIM(@Mat) LIKE '%(MONTH)'
THEN '(MONTH)'
END AS EquipmentType
FROM etc.
但是,这仅在您只有这些字符串时有效。我还假设它们总是在最后,并且只有白色 space(可以被 RTRIM()
剥离)可以跟在它们之后。
我有一个 SQL 服务器存储过程,我在其中输入值 'Mat',该值的末尾可能包含:(DAY)、(MONTH)、(HR)
如果这个值存在,我希望能够使用正则表达式或其他更容易的方式将其提取出来,并将其存储为另一列。
我目前尝试在 SQL 服务器中使用 LIKE
操作作为新列,但我不相信 SQL 服务器允许这样做。
这是我当前的存储过程:
ALTER PROCEDURE [dbo].[UpdateMaterial_Get_MaterialValues_ByMaterialName]
--UpdateMaterial_Get_MaterialValues_ByMaterialName '2 Inch Discharge Hose (DAY)'
--UpdateMaterial_Get_MaterialValues_ByMaterialName '2 Step Hydroseeding'
@MAT NVARCHAR(255)
AS
BEGIN
SELECT
DEFAULTS.Mat, DEFAULTS.Region, DEFAULTS.MatUnit, DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
@MAT LIKE '(\S+)' AS EquipmentType
FROM
tbl_MaterialDefaults DEFAULTS
RIGHT JOIN
tbl_Client_List_Type_Desc TYPEDESC ON TYPEDESC.Num = DEFAULTS.MatID
WHERE
Mat = @MAT
END
目前我在尝试执行 ALTER
:
Incorrect syntax near the keyword 'like'.
您可以在@MAT 值可能是什么的代码中看到两个示例。这是我对两者的期望:
对于@MAT 值“2 英寸排放软管(白天)”
Mat Region MatUnit MatWidth MatType EquipmentType
2 Inch Discharge Hose (DAY) Standard Sacramento ACRE 1.00 MATERIAL (DAY)
对于@MAT 值“2 步水力播种”
Mat Region MatUnit MatWidth MatType EquipmentType
2 Step Hydroseeding Standard Sacramento ACRE 1.00 MATERIAL
你可以试试这个:
在您的存储过程中:
DECLARE @ExprStart int = -1,
@ExprEnd int = -1,
@EquipmentType varchar(100) = NULL
IF @Mat LIKE '%(%)%' BEGIN
SET @ExprStart = PATINDEX('%)%', REVERSE(@Mat)),
@ExprEnd = PATINDEX('%(%', REVERSE(@Mat))
SET @EquipmentType = REVERSE(SUBSTRING( @Mat, @ExprStart, @ExprEnd - @ExprStart + 1 ))
END
SELECT
DEFAULTS.Mat,
DEFAULTS.Region,
DEFAULTS.MatUnit,
DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
@EquipmentType AS EquipmentType
FROM
tbl_MaterialDefaults DEFAULTS
RIGHT JOIN
tbl_Client_List_Type_Desc TYPEDESC ON TYPEDESC.Num = DEFAULTS.MatID
WHERE
Mat = @MAT
如果 - 且仅当 - 您在末尾的设备类型之前没有任何括号时,这将起作用。但是我相信你说的是这样。
编辑添加:我看到你已经说过前面的括号可能会发生。我已经调整了代码以适应这一点。我的新版本假设我们从 @Mat
.
编辑以添加更简单的版本:如果您只需要担心 (HR)
、(DAY)
和 (MONTH)
,我们可以这样做:
-- We don't need any of those declarations or PATINDEXes.
SELECT
DEFAULTS.Mat,
DEFAULTS.Region,
DEFAULTS.MatUnit,
DEFAULTS.MatWidth,
TYPEDESC.TypeDesc AS MatType,
CASE WHEN RTRIM(@Mat) LIKE '%(HR)'
THEN '(HR)'
WHEN RTRIM(@Mat) LIKE '%(DAY)'
THNE '(DAY)'
WHEN RTRIM(@Mat) LIKE '%(MONTH)'
THEN '(MONTH)'
END AS EquipmentType
FROM etc.
但是,这仅在您只有这些字符串时有效。我还假设它们总是在最后,并且只有白色 space(可以被 RTRIM()
剥离)可以跟在它们之后。