根据其他三列的值创建自定义列



在我目前正在进行的这个项目中(我正在桌面应用程序和新的电子商店之间建立一座桥梁),有一个产品表定义了一些备用列,无论最终用户出于什么原因可能需要将一些自定义数据存储到其中,都可以使用这些列。

因此,用户需要设置一个真/假标志来确定产品是否会出现在三个不同的滑块中。。。不幸的是,实现这一点的人甚至没有使用相同类型的备用列。。。所以,

Slider1的标志存储在varchar(50)列中
  • Slider2的标志存储在float列中
  • Slider3的标志存储在float列中
  • 此外,我为它们中的每一个运行了SELECT DISTINCT <column>,以了解存储在每一列中的实际数据,并得到以下结果:

    • varchar列中存储了以下数据:
    FLDSTRING1
    ''
    0
    1
    194276400456

    由于您使用的是SQL Server 2014,因此您可以尝试STUFF,而不是CONCAT_WS,如下所示。通过在所有字符串之前加上分隔符,STUFF将删除找到的第一个逗号。

    SELECT 
    FLDSTRING1, 
    FLDFLOAT5, 
    FLDFLOAT6, 
    STUFF(
    CONCAT(
    CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 IN ('0','') THEN '' THEN '' ELSE ',NEWPROD' END, 
    CASE WHEN FLDFLOAT5 IS NULL THEN '' ELSE ',CUSTOM1' END,
    CASE WHEN FLDFLOAT6 IS NULL THEN '' ELSE ',CUSTOM2' END
    ),
    1,1,''
    ) AS TAGS
    FROM @MATERIAL
    GROUP BY FLDSTRING1, FLDFLOAT5, FLDFLOAT6;
    

    查看工作演示数据库fiddle

    让我知道这是否适合你。

    使用CONCAT_WS()函数将值连接到逗号(或其他分隔符)分隔的列表中,将忽略null

    要使用CONCAT_WS(),如果值为"0",则需要传递一个真正的NULL;空白";(根据您的定义),否则您的自定义标签:

    SELECT DISTINCT
    FLDSTRING1,
    FLDFLOAT5,
    FLDFLOAT6,
    CONCAT_WS(',',
    CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 = '' OR FLDSTRING1 = '0' THEN NULL ELSE 'NEWPROD' END,
    CASE WHEN FLDFLOAT5 IS NULL OR FLDFLOAT5 = 0 THEN NULL ELSE 'CUSTOM1' END,
    CASE WHEN FLDFLOAT6 IS NULL OR FLDFLOAT6 = 0 THEN NULL ELSE 'CUSTOM2' END) AS TAGS
    FROM MATERIAL
    

    GROUP BY替换为DISTINCT,因为它更简单并且(在这里)实现了相同的功能。


    如果CONCAT_WS不可用:

    SELECT DISTINCT
    FLDSTRING1,
    FLDFLOAT5,
    FLDFLOAT6,
    REPLACE(REPLACE(REPLACE(CONCAT(
    CASE WHEN FLDSTRING1 IS NULL OR FLDSTRING1 = '' OR FLDSTRING1 = '0' THEN 'X' ELSE 'NEWPROD' END,
    ',',
    CASE WHEN FLDFLOAT5 IS NULL OR FLDFLOAT5 = 0 THEN 'X' ELSE 'CUSTOM1' END,
    ',',
    CASE WHEN FLDFLOAT6 IS NULL OR FLDFLOAT6 = 0 THEN 'X' ELSE 'CUSTOM2' END
    ), ',X', ''), 'X,', ''), 'X', '') AS TAGS
    FROM MATERIAL
    

    请参见dbfiddle。

    最新更新