在SQL Server中的两个变量点之间提取字符串

时间:2017-04-05 19:17:24

标签: sql-server search substring

我有一个列应该包含与此

相似的文本
Storage Location: E10-2
Die Area: 28.90

我真正关心的是" E10-2"部分。

我在下面发布的代码是我提出的最好的代码,我只是在看它。

首先,我依赖的是线路没有被反转的事实。其次,我依靠前面的两个空格和位置后的回车。最后这是一个非常冗长而繁琐的选择字符串。

我研究过使用动态SQL,但考虑到" FROM"的大小,这似乎更加麻烦。言。

我错了吗?是否有更优雅的方式来实现这一目标?可能验证部分存储位置:"因此,我知道我正在看这个领域的正确线路吗?

SELECT SUBSTRING(
    CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)), 
    CHARINDEX(' ',CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)),CHARINDEX(' ',CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)))+1),
    CHARINDEX(CHAR(10),CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)))-CHARINDEX(' ',CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)) ,CHARINDEX(' ',CONVERT(VARCHAR(MAX),CONVERT(BINARY(8000),RB.BITS)))+1))
FROM  
    TLS.DBO.REQUIREMENT R
INNER JOIN 
    TLS.DBO.REQUIREMENT_BINARY RB ON R.WORKORDER_BASE_ID = RB.WORKORDER_BASE_ID 
                                  AND R.WORKORDER_LOT_ID = RB.WORKORDER_LOT_ID 
                                  AND R.WORKORDER_SPLIT_ID = RB.WORKORDER_SPLIT_ID 
                                  AND R.WORKORDER_SUB_ID = RB.WORKORDER_SUB_ID 
                                  AND R.PIECE_NO = RB.PIECE_NO
WHERE 
    R.WORKORDER_BASE_ID = 'FP-01405-0032' AND
    R.PART_ID LIKE 'PCH%'

1 个答案:

答案 0 :(得分:1)

我喜欢使用CTE来减少CONVERT和CHARINDEX的数量作为第一步:

;WITH TextStr AS (
    SELECT 
        Substring(
            Charindex('Storage Location:', 
                CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), RB.BITS) ) + 17), DATALENGTH(RB.BITS)) as WorkStr
    FROM TLS.DBO.REQUIREMENT R
    INNER JOIN TLS.DBO.REQUIREMENT_BINARY RB ON
        R.WORKORDER_BASE_ID = RB.WORKORDER_BASE_ID AND
        R.WORKORDER_LOT_ID = RB.WORKORDER_LOT_ID AND
        R.WORKORDER_SPLIT_ID = RB.WORKORDER_SPLIT_ID AND
        R.WORKORDER_SUB_ID = RB.WORKORDER_SUB_ID AND
        R.PIECE_NO = RB.PIECE_NO
    WHERE 
        R.WORKORDER_BASE_ID = 'FP-01405-0032' AND
        R.PART_ID LIKE 'PCH%'
    )
SELECT 
    LTRIM(RTRIM(LEFT(WorkStr, CHARINDEX(CHAR(10), WorkStr + CHAR(10))-1)))
FROM TextStr

基本上,我搜索你的行标签,跳过它,然后返回一个包含该点之后所有文本的字符串。然后我在结果字符串中找到下一个换行符,并在那里拆分文本,保留换行符之前的所有内容。

做出的假设:

  • Char(10)是您的NewLine指标
  • 最后一行可能有也可能没有NewLine
  • Image字段理论上可以有超过8K字节

希望这有帮助。

编辑:以下是查询的固定代码:

;WITH TextStr AS (
    SELECT 
        Substring(CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), RB.BITS)),
            Charindex('Storage Location:', 
                CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), RB.BITS) ) + 17), DATALENGTH(RB.BITS)) as WorkStr
    FROM TLS.DBO.REQUIREMENT R
    INNER JOIN TLS.DBO.REQUIREMENT_BINARY RB ON
        R.WORKORDER_BASE_ID = RB.WORKORDER_BASE_ID AND
        R.WORKORDER_LOT_ID = RB.WORKORDER_LOT_ID AND
        R.WORKORDER_SPLIT_ID = RB.WORKORDER_SPLIT_ID AND
        R.WORKORDER_SUB_ID = RB.WORKORDER_SUB_ID AND
        R.PIECE_NO = RB.PIECE_NO
    WHERE 
        R.WORKORDER_BASE_ID = 'FP-01405-0032' AND
        R.PART_ID LIKE 'PCH%'
    )
SELECT 
    LTRIM(RTRIM(LEFT(WorkStr, CHARINDEX(CHAR(10), WorkStr + CHAR(10))-1)))
FROM TextStr