同一结果列的多个案例

时间:2019-03-28 16:42:26

标签: tsql

有一张表,其中的一列包含我需要用于报告的所有信息。 我想将该列的某些部分作为该报告的一列,但是问题是该列的结果来自3种不同的字符长度。

示例:

   vc = await channel.connect()
   vc.play(discord.FFmpegPCMAudio(executable="C:/path/ffmpeg.exe", source="mp3.mp3"))

在此特定示例中,我希望中间部分(例如ABC)是称为“初始”的列,问题是我对每个LEN使用CASE逻辑。不确定如何实现此目标。

下面我的示例查询。它提取所有可能的选项,但作为单独的列。我要怎么做才能将这3个选项拉入一列,我们称之为“初始”?

谢谢

Row1: 20180101_ABC_12
Row2: 20180102_DEFG_23
Row3: 20180103_HIJKL_45

2 个答案:

答案 0 :(得分:2)

在Tableau中,您将使用计算所得的字段来完成此操作。

首字母缩写:

CASE LEN(FileName)
    WHEN 10 THEN SUBSTRING(FileName, 10, 3)
    WHEN 11 THEN SUBSTRING(FileName, 10, 4)
    WHEN 12 THEN SUBSTRING(FileName, 10, 5)
END

或者也许

SUBSTRING(FileName
         ,10
         ,CASE LEN(FileName)
              WHEN 10 THEN 3
              WHEN 11 THEN 4
              WHEN 12 THEN 5
          END
          )

但是,如果不考虑更多技术方面的问题,则可以通过数学来解决(假设您的数据限于10、11和12,或者该模式适用):

SUBSTRING(FileName
          ,10
          ,LEN(FileName)-7
         )

答案 1 :(得分:1)

您需要1条CASE语句来涵盖所有可能的情况,而不是3个单独的情况,因为每个情况都会创建一个新列:

SELECT
    FileName
    , CASE LEN(FileName) 
        WHEN 10 THEN SUBSTRING(FileName, 10, 3)
        WHEN 11 THEN SUBSTRING(FileName, 10, 4)
        WHEN 12 THEN SUBSTRING(FileName, 10, 5) 
        ELSE NULL 
      END AS Initials
FROM File

获取介于2 _之间的所有内容的另一种方法:

SELECT
    FileName
    , substring(
        left(FileName, len(FileName) - charindex('_', reverse(FileName) + '_')), 
        charindex('_', FileName) + 1,
        len(FileName)
    )  AS Initials
FROM File

但是根据您的逻辑,我假设列FileName中的值具有相同的样式:

<9 digits>_<Initials>_<2 digits>

如果是这种情况,那么您可以得到想要的东西:

SELECT
    FileName
    , substring(FileName, 10, len(FileName) - 12) AS Initials
FROM File