Power BI DesktopとData Analysis Expressions (DAX) のデータ型について調べます。
3.テキスト型(STRING)
Power Queryでは text型 と呼びますが、Power BIデータモデルでは STRING型 と呼びます。Unicode 文字のデータ文字列です。文字列の最大長は 268,435,456 Unicode 文字 (256 メガ文字) または 536,870,912 バイトです。
Case (in-)sensitivity(大文字と小文字の区別)
大文字と小文字は区別されません。 テキスト型が読み込まれると、ハッシュエンコーディングされ、Power BIデータモデルにディクショナリ型で登録され、その辞書を使って表示します。
let
Source =
Table.FromRecords(
{
[OrderNo=1001, Addressee="Taina Hasu"],
[OrderNo=1002, Addressee="Ellis Turner"],
[OrderNo=1003, Addressee="MURALI DAS"],
[OrderNo=1004, Addressee="TAINA HASU"],
[OrderNo=1005, Addressee="Taina HASU"],
[OrderNo=1006, Addressee="Ellis TURNER"],
[OrderNo=1007, Addressee="Murali Das"]
},
type table [OrderNo = Number.Type, Addressee = Text.Type]
)
in
Source
つまり、Power BIデータモデルでは、以下の図のように 最初に出現した文字に寄せられてしまいます 。
これは、DAXでテーブルを直接作成しても同様の結果になります。
CaseSensitivity2 = DATATABLE(
"OrderNo", INTEGER,
"Addressee", STRING,
{
{1001, "Taina Hasu"},
{1002, "Ellis Turner"},
{1003, "MURALI DAS"},
{1004, "TAINA HASU"},
{1005, "Taina HASU"},
{1006, "Ellis TURNER"},
{1007, "Murali Das"}
}
)
"Taina Hasu" = "TAINA HASU" // TRUE
大文字小文字を区別して比較を行う場合は、 EXACT 関数を使用する方法があります。
EXACT("Taina Hasu","TAINA HASU") // FALSE
しかし、読み込み時に変換されたデータは、元の形を使ってマッチングすることはできません。
日本語では、「吉」と「𠮷」は別の文字になりますし、問題になることはあまりないと思いますが、どうしても大文字小文字を区別させたい場合は、インデックス列と組み合わせたり、怪しげな方法を使う手もあります。
Trailing spaces(末尾のスペース)
Power BIのエンジンは、文字列の末尾のスペースを除去しますが、先頭のスペースは削除されません。
下図は、左がPower Queryのデータで、右がPower BIに読み込まれたデータです。空白は「*」に置き換えて表示し、文字列の長さを横に示しています。
let
Source =
Table.FromRecords(
{
[No=1,Name="Dylan Williams"],
[No=2,Name="Dylan Williams "],
[No=3,Name=" Dylan Williams"],
[No=4,Name=" Dylan Williams "]
},
type table [No=Int64.Type, Name = Text.Type]
),
ReplaceSpaceToAsterisk = Table.AddColumn(Source, "Name(PQ)", each Text.Replace([Name]," ", "*")),
AddLength = Table.AddColumn(ReplaceSpaceToAsterisk, "Length(PQ)", each Text.Length([Name]))
in
AddLength
Power Queryで Text.Trim を使って先頭と末尾の空白を除去しておくことで、全て同一のものとして処理することができます。
4.論理型(BOOLEAN(True/False))
TrueまたはFalseを示すブール値です。
Power Queryでデータ型を設定せず、Any.Typeのまま読み込まれた場合、テキスト項目となります。
let
Source =
Table.FromRecords(
{
[CustomerNumber = 1001, Flag = false],
[CustomerNumber = 1002, Flag = true],
[CustomerNumber = 1003, Flag = true],
[CustomerNumber = 1004, Flag = false],
[CustomerNumber = 1005, Flag = true]
}
)
in
Source
この項目は、DAXでTrue/Falseの判定を行う場合、上図の「FlagCheck」の項目に見られるように期待通りの結果となります。
FlagCheck = IF(Bool1[Flag], "ON", "OFF")
このままで問題ないとされてしまうかもしれませんが、Power BIサービスに発行しデータセットの更新を行うと、以下のように表示が0と-1になってしまいます。
全て問題なく動作させるためには、Power Queryの時点で型をtype logicalに設定しておくか、読み込んだ後にデータ型を変更しておきます。