我有一个列应该包含与此
相似的文本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%'
答案 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
基本上,我搜索你的行标签,跳过它,然后返回一个包含该点之后所有文本的字符串。然后我在结果字符串中找到下一个换行符,并在那里拆分文本,保留换行符之前的所有内容。
做出的假设:
希望这有帮助。
编辑:以下是查询的固定代码:
;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