Sql server Microsoft SQL Case语句无法按Order By语句运行
我有一个数据库列,用作产品变体的分组,它不是第一个标准形式。我们不需要将宽度、高度和测量值放在单独的列中 我们在这一数据库列中有各种属性,例如,产品尺寸如1200*400mm,有时米如1m,甚至颜色如红色、蓝色和绿色。 问题在于CASE语句被忽略,SQL试图将CASE语句中的黑色转换为Int。 目前,代码需要按照SQL现在所做的正确排序大小。当它获取一个只有颜色属性的产品,并且案例语句在Order By部分附近被忽略时,问题就出现了 我创建了这个SQL小提琴来展示DB列的大小和颜色。 这是我当前的SQL:Sql server Microsoft SQL Case语句无法按Order By语句运行,sql-server,sorting,case,Sql Server,Sorting,Case,我有一个数据库列,用作产品变体的分组,它不是第一个标准形式。我们不需要将宽度、高度和测量值放在单独的列中 我们在这一数据库列中有各种属性,例如,产品尺寸如1200*400mm,有时米如1m,甚至颜色如红色、蓝色和绿色。 问题在于CASE语句被忽略,SQL试图将CASE语句中的黑色转换为Int。 目前,代码需要按照SQL现在所做的正确排序大小。当它获取一个只有颜色属性的产品,并且案例语句在Order By部分附近被忽略时,问题就出现了 我创建了这个SQL小提琴来展示DB列的大小和颜色。 这是我
DECLARE @StockID int = 684
DECLARE @VariationParent int = (SELECT TOP 1 StockParent_ParentId FROM
StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id =
SV.StockParent_ChildId WHERE StockParent_ChildId = @StockID AND
SV.IsDeleted = 0 AND FGP.IsDeleted = 0 AND FGP.Publish = 1)
SELECT AV.ID, AV.AttrValue, AV.AttributeTypes_Id 'AttributeTypeID',
CAST(CASE WHEN SA.StockParent_Id = @StockID THEN 1 ELSE 0 END as BIT)
'IsDefault'
FROM AttributeTypes AT
INNER JOIN AttributeValues AV ON AV.AttributeTypes_Id = AT.Id
INNER JOIN StockParent_AttributeValues SA on SA.AttributeValue_Id = AV.Id
INNER JOIN FinGoodsParent FGP ON FGP.Id = SA.StockParent_Id AND
FGP.IsDeleted = 0 AND FGP.Publish = 1
WHERE SA.StockParent_Id IN (SELECT SV.StockParent_ChildId FROM
StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id =
SV.StockParent_ChildId AND FGP.IsDeleted = 0 AND FGP.Publish = 1 WHERE
SV.StockParent_ParentId = @VariationParent AND SV.IsDeleted = 0)
AND SA.IsDeleted = 0 AND AT.IsDeleted = 0 AND AV.IsDeleted = 0
ORDER BY
CASE WHEN (CHARINDEX('*', AV.AttrValue) > 0
AND CHARINDEX('mm', AV.AttrValue) > 0)
THEN
CONVERT(int, (select top 1 value from STRING_SPLIT(AV.AttrValue, '*'))) *
CONVERT(int, (select top 1 LEFT(value, LEN(value) - 2) from
STRING_SPLIT(AV.AttrValue, '*') where value LIKE '%mm'))
ELSE
AV.AttrValue
END
ASC
这是我在尝试获取仅具有颜色属性的产品并使用CASE语句按属性名称对其排序时遇到的错误
所以基本上我得到了这个SQL代码来进行排序
我添加了CASE语句,以尝试只在列中有星号*和mm时进行排序,否则,我只希望在列包含例如红色或黑色而不是数字时,通常使用按属性值排序
已更新
我已经更新了SQL FIDLE,因为数据输出应该是大小或颜色。因此,我为这个示例添加了一个类型为的附加列。在WHERE子句附近检索数据的SQL对于大小应该是0,对于颜色应该是1,并且SQL应该仍然能够正常工作并正确排序大小的输出
解释: 考虑以下几点:
计算条件列表和类型集中优先级最高的类型。在您的情况下,CASE
和int
作为可能的返回值,这解释了将varchar值“Black”转换为int数据类型时,varchar
转换失败的原因
- 不要使用
中选择TOP 1,因为从STRING\u SPLIT()
不能保证拆分子字符串的顺序与其在原始字符串中的位置相匹配。在您的情况下,您可以尝试使用带有STRING\u SPLIT()
、LEFT
和RIGHT
函数的简单字符串解析。之后,您需要将计算结果转换为CHARINDEX
varchar
CREATE TABLE attributes
([AttrValue] varchar(13))
;
INSERT INTO attributes
([AttrValue])
VALUES
('900*900mm'),
('1200*900mm'),
('1200*1200mm'),
('1200*6000mm'),
('1500*3000mm'),
('Red'),
('Green'),
('Black'),
('Purple')
;
声明:
SELECT
AttrValue
FROM
attributes
ORDER BY
CASE
WHEN (CHARINDEX('*', AttrValue) > 0 AND CHARINDEX('mm', AttrValue) > 0) THEN
RIGHT(
REPLICATE('0', 13) +
CONVERT(
varchar(13),
CONVERT(int, LEFT(REPLACE(AttrValue, 'mm', ''), CHARINDEX('*', REPLACE(AttrValue, 'mm', '')) - 1)) *
CONVERT(int, RIGHT(REPLACE(AttrValue, 'mm', ''), LEN(REPLACE(AttrValue, 'mm', '')) - CHARINDEX('*', REPLACE(AttrValue, 'mm', ''))))
),
13
)
ELSE AttrValue
END ASC
输出:
--------------
AttrValue
--------------
900*900mm
1200*900mm
1200*1200mm
1500*3000mm
1200*6000mm
Black
Green
Purple
Red
谢谢你的回答。我已经更新了我的问题和小提琴上面。输出应仅检索大小或颜色。由于某些原因,在SQL FIDLE中,数字的顺序看起来不正确。它应该从最小的数字到最大的数字,颜色应该从A到Z。我的错误是@Tig7r,结果应该用
0
填充。如果有额外的attType
字段,则不需要将计算转换为varchar(12)`CASE
检查更新的示例。谢谢