Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Microsoft SQL Case语句无法按Order By语句运行_Sql Server_Sorting_Case - Fatal编程技术网

Sql server Microsoft SQL Case语句无法按Order By语句运行

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列的大小和颜色。 这是我

我有一个数据库列,用作产品变体的分组,它不是第一个标准形式。我们不需要将宽度、高度和测量值放在单独的列中

我们在这一数据库列中有各种属性,例如,产品尺寸如1200*400mm,有时米如1m,甚至颜色如红色、蓝色和绿色。

问题在于CASE语句被忽略,SQL试图将CASE语句中的黑色转换为Int。

目前,代码需要按照SQL现在所做的正确排序大小。当它获取一个只有颜色属性的产品,并且案例语句在Order By部分附近被忽略时,问题就出现了

我创建了这个SQL小提琴来展示DB列的大小和颜色。

这是我当前的SQL:

  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
    作为可能的返回值,这解释了将varchar值“Black”转换为int数据类型时,
    转换失败的原因
  • 不要使用
    从STRING\u SPLIT()
    中选择TOP 1,因为
    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
检查更新的示例。谢谢