从字符串DAX中删除所有非数字字符

时间:2017-10-09 09:37:46

标签: ssas powerbi dax ssas-tabular

是否可以从计算列中DAX的不同长度的字符串中删除所有非数字字符?

该模型是模型,因此我无法在查询时使用M语言清理数据。

此外,我想删除起始0位数,但不是结束0。

在列中考虑以下输入:

C1
C2
C3
6F
2F
5Z
05F
A10

这是我正在寻找的输出

1
2
3
6
2
5
5
10

1 个答案:

答案 0 :(得分:2)

如果列已知宽度,而不是太宽,则可以使用此方法。我们假设您的混合字母和数字列称为[Letters And Numbers]

Just The Numbers = IFERROR(VALUE(MID([Letters And Numbers], 1, 1)), IFERROR(VALUE(MID([Letters And Numbers], 2, 1)), BLANK()))

当然,如果您希望列中有多个数字,这会变得更加复杂。

在这种情况下,使用DAX语言执行此操作会非常非常不便;你需要写一些类似的东西:

Just The Numbers = SUBSTITUTE(SUBSTITUTE([Letters And Numbers], "A", ""), "B", "")
除非您需要更多或更少的非数字字符,否则

除非您需要26个替代品。

最好在编辑查询部分使用M.添加具有以下定义的自定义列:

= Table.AddColumn(#"Previous Step", "Just The Numbers", each Text.Combine(List.RemoveItems(Text.ToList([Letters And Numbers]),{"A".."z"})))

如果您因为使用直接查询到SSAS表格模型而无法使用M,则唯一的选择可能是修改将表加载到表格模型中的SQL查询以添加其他列。

可能有很多T-SQL的例子可以做到这一点,这里有一个:

USE AdventureWorksDW2012;

WITH split AS (
    SELECT AddressLine1, v.number, character.c
      FROM DimReseller AS r
      JOIN master..spt_values AS v ON v.number BETWEEN 1 AND LEN(r.AddressLine1)
      CROSS APPLY (VALUES(SUBSTRING(r.AddressLine1, v.number, 1))) AS character(c)
      WHERE v.type = 'P'
        AND character.c LIKE '[0-9]')
SELECT AddressLine1, 
       output = (SELECT c 
                   FROM split
                   WHERE r.AddressLine1 = split.AddressLine1 
                   ORDER BY number ASC 
                   FOR XML PATH, TYPE).value(N'.[1]', N'bigint')
  FROM dbo.DimReseller AS r
  GROUP BY AddressLine1;