使用正则表达式从字符串中提取值并存储为新的列值

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() 剥离)可以跟在它们之后。