抱歉这个误导性的话题,我不知道如何更好地表达。
因为我主要是一名软件开发人员,所以我想到了三元运算符并解决了以下问题。
我需要找到通过可为空的外键链接两个表的最可靠的方法(modModel
and tabSparePart
)。两者之间唯一的相似之处是型号名称和备件描述(tabSparePart
是自动导入的客户的外部表,所以这不是我的责任,我无法更改数据)。
考虑以下备件名称:
W200I_E/Swap
EXCHANGEUNIT P1i / SILVERBLACK/ CYRILLIC
我想找到的型号是P1i
and W200I_E
。
所以我只能保证一条强有力的规则where-clause
:
这是示例数据:
Create table #temp(Partname varchar(100))
INSERT INTO #temp
SELECT 'EXCHANGEUNIT P1i / SILVERBLACK/ CYRILLIC' UNION ALL SELECT 'W200I_E/Swap unit/Black'
我将完成以下查询:
SELECT RTRIM(LEFT(Partname, CHARINDEX('/', Partname) - 1)) AS UNIT
FROM #temp
WHERE CHARINDEX('/', Partname) > 0
...返回什么:
EXCHANGEUNIT P1i
W200I_E
但是我需要P1i
。所以我需要一种方法来处理第一部分由空格分隔的情况。在这种情况下,我需要选择最后一个单词,但前提是它is根本就分开了。
我得到了一个"invalid length parameter passed to the LEFT or SUBSTRING function"
-以下查询出错:
SELECT REVERSE( LEFT( REVERSE(RTRIM(LEFT(Partname, CHARINDEX('/', Partname) - 1)))
, CHARINDEX(' ', REVERSE(RTRIM(LEFT(Partname, CHARINDEX('/', Partname) - 1))))-1 ))
AS Unit
FROM #temp
WHERE CHARINDEX('/', Partname) > 0
如果没有第二条记录没有空格,这也可以工作。如果我还要确保第一部分包含空格,我将丢弃有效记录。
总而言之,我需要根据分隔符的存在找到一种将两种方式结合起来的方法。
PS:出现这种情况的原因是:获取 varchar 一部分的最后一个单词(左/右) https://stackoverflow.com/questions/8444175/get-the-last-word-of-a-part-of-a-varchar-left-right
如果有人感兴趣,这是完整的(工作的)存储过程。我确定我从来没有用过这么奇怪的东西JOIN
:
CREATE PROC [dbo].[UpdateModelSparePart](@updateCount int output)
with execute as Owner
AS
BEGIN
BEGIN TRANSACTION
UPDATE modModel SET fiSparePart=ModelPart.idSparePart
FROM modModel INNER JOIN
(
SELECT m.idModel
,m.ModelName
,sp.idSparePart
,sp.Price
,Row_Number()Over(Partition By idModel ORDER BY Price DESC)as ModelPrice
FROM modModel AS m INNER JOIN tabSparePart AS sp
ON m.ModelName = CASE
WHEN CHARINDEX(' ', REVERSE(RTRIM(LEFT(sp.SparePartDescription, CHARINDEX('/', sp.SparePartDescription) - 1)))) > 0 THEN
REVERSE( LEFT( REVERSE(RTRIM(LEFT(sp.SparePartDescription, CHARINDEX('/', sp.SparePartDescription) - 1)))
,CHARINDEX(' ', REVERSE(RTRIM(LEFT(sp.SparePartDescription, CHARINDEX('/', sp.SparePartDescription) - 1))))-1 ))
ELSE
RTRIM(LEFT(sp.SparePartDescription, CHARINDEX('/', sp.SparePartDescription) - 1))
END
WHERE (CHARINDEX('/', sp.SparePartDescription) > 0)
GROUP BY idModel,ModelName,idSparePart,Price
)As ModelPart
ON ModelPart.idModel=modModel.idModel
Where ModelPrice=1
SET @updateCount = @@ROWCOUNT;
COMMIT TRANSACTION
END