Power BIデータモデルの型システム (2) テキスト型、論理型

https://learn.microsoft.com/ja-jp/power-bi/connect-data/desktop-data-types

　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データモデルにディクショナリ型で登録され、その辞書を使って表示します。

```text:CaseSensitivity(PowerQuery)
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
```
![g4367.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/83469932-3d8c-f6ff-892d-104380fee015.png)

　つまり、Power BIデータモデルでは、以下の図のように **最初に出現した文字に寄せられてしまいます** 。

![g4210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/ba41e866-57cd-aee6-df6e-0b4fb2fb6f4d.png)

　これは、DAXでテーブルを直接作成しても同様の結果になります。

```text:CaseSensitivity2(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"}
    }
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/97cbdaa8-6cbc-85b7-4c7f-5d2301c6a0c8.png)
　DAXでの文字列の比較の際も、以下の式は成立します。

```text:比較
"Taina Hasu" = "TAINA HASU" // TRUE
```
　大文字小文字を区別して比較を行う場合は、 **EXACT** 関数を使用する方法があります。

```text:EXACT
EXACT("Taina Hasu","TAINA HASU") // FALSE
```
　しかし、読み込み時に変換されたデータは、元の形を使ってマッチングすることはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/3aa2b4d9-bfe3-d947-a463-98170ce69713.png)

　日本語では、「吉」と「𠮷」は別の文字になりますし、問題になることはあまりないと思いますが、どうしても大文字小文字を区別させたい場合は、インデックス列と組み合わせたり、怪しげな方法を使う手もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/085dbbfd-9747-36ca-d81e-1a3668b8b97c.png)

### Trailing spaces(末尾のスペース)
　Power BIのエンジンは、文字列の末尾のスペースを除去しますが、**先頭のスペースは削除されません**。
　下図は、左がPower Queryのデータで、右がPower BIに読み込まれたデータです。空白は「*」に置き換えて表示し、文字列の長さを横に示しています。

```text:PowerQuery
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
```

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/1077d038-dbb4-6949-1a2f-e969b899c1f7.png"/>

　Power Queryで **Text.Trim** を使って先頭と末尾の空白を除去しておくことで、全て同一のものとして処理することができます。

# 4.論理型（BOOLEAN(True/False)）
　TrueまたはFalseを示すブール値です。
　Power Queryでデータ型を設定せず、Any.Typeのまま読み込まれた場合、テキスト項目となります。

```text:Bool1
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
```
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/fda7fecc-6f94-45e8-80e8-e17b1a3daeb5.png"/>
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/63df0914-eae2-72d4-1e4a-3384e31ccfd7.png"/>

　この項目は、DAXでTrue/Falseの判定を行う場合、上図の「FlagCheck」の項目に見られるように期待通りの結果となります。

```text:FlagCheck
FlagCheck = IF(Bool1[Flag], "ON", "OFF")
```
　このままで問題ないとされてしまうかもしれませんが、Power BIサービスに発行しデータセットの更新を行うと、以下のように表示が0と-1になってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/7f94c11a-23a7-2bc0-2a5b-fa8c44848db9.png)
　全て問題なく動作させるためには、Power Queryの時点で型を**type logical**に設定しておくか、読み込んだ後にデータ型を変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/85574096-d477-b153-712c-2644c195a729.png)

# 関連記事
1. [[Power BI] Power Queryの『型』を探る (1) number](https://qiita.com/spumoni/items/9459635b69db773eca30)
1. [[Power BI] Power Queryの『型』を探る (2) text, temporal falimy](https://qiita.com/spumoni/items/ce38958d9858ea132a8f)
1. [[Power BI] Power Queryの『型』を探る (3) number 蛇足](https://qiita.com/spumoni/items/c46b3ddfb8173b6e9aa2)
1. [[Power BI] Power Queryの『型』を探る (4) null](https://qiita.com/spumoni/items/d8279858ceb627af8101)
1. [[Power BI] Power Queryの『型』を探る (5) カスタム型](https://qiita.com/spumoni/items/ec6893c9e4527b674b76)
1. [Power BIデータモデルの型システム (1) 数値型、日付／時刻型](https://qiita.com/spumoni/items/c73e465b691b15694ba0)
1. [Power BIデータモデルの型システム (2) テキスト型、論理型](https://qiita.com/spumoni/items/476494dc7818edc5e190)