3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Power Query workout - Type operator

Posted at

いちど整理して理解しておくだけでも十分。

Type operator

型演算子 "かたえんざんし" と呼ぶより タイプ演算子 "たいぷえんざんし" と呼ぶことが多いかな
is / as の評価式、いずれも プリミティブ データタイプを右辺で
any, null, logical, number, time, date, datetime, datetimezone, duration, text, binary, type, list, record, table, function, anynonnull, none

  • any だけ null を許容する
  • any 以外は null を許容しない

ほか、action も定義されているけれども。

is

左辺の値について右辺のタイプに互換性があるかの検査

1 is number     // true
"a" is text     // true
1 is text       // false

[] is record    // true
{} is list      // true

null is number  // false
null is nullable number // true
null is any     // true
null is anynonnull  // false

Type.Is

Type.Is( Value.Type( 1 ), type number )     // true
Type.Is( Value.Type( 1 ), Number.Type )     // true
Type.Is( Value.Type( 1.5 ), Int64.Type )    // true
Type.Is( Value.Type( "a" ), type text )     // true
Type.Is( Value.Type( 1 ), type text )       // false

Type.Is( Value.Type( [] ), type record )    // true
Type.Is( Value.Type( {} ), type list )      // true

Type.Is( Value.Type( null ), type number )  // false 
Type.Is( Value.Type( null ), type nullable number ) // true

Type.Is( Value.Type( null ), Int64.Type )   // false

Type.Is( type none , Type.NonNullable( type null ) )    // true
Type.Is( None.Type , Type.NonNullable( type null ) )    // true

Type.Is( type null , Type.NonNullable( type null ) )    // false

as

タイプ アサーション
内部的に is 演算子 による評価。互換性があるとき、右辺の値がそのまま返る。

( 1 as number ) = 1     // true
( "a" as text ) = "a"   // true
( null as nullable number ) = null  // true
( null as nullable text ) = null    // true

( 1 as any ) = 1        // true
( "a" as any ) = "a"    // true

( 1 as anynonnull ) = 1     // true

( [] as record ) = []   // true
( {} as list ) = {}     // true
( {1} as list ) = {1}   // true

互換性がない場合、Expression.Error

"a" as number   // Expression.Error
------
[
    Reason = "Expression.Error",
    Message = "We cannot convert the value "a" to type Number.",
    Detail = [
        Value = "a",
        Type = type number
    ]
]

Value.As

Value.As( 1, type number ) = 1  // true
Value.As( 1, Number.Type ) = 1  // true
Value.As( 1.5, Int64.Type ) = 1.5   // true

Value.As( null, type nullable number ) = null   // true

Value.As( "a", type text ) = "a"    // true
Value.As( "a", Text.Type ) = "a"    // true
Value.As( null, Type.NonNullable( type nullable number ) )
// Expression.Error
------
[
    Reason = "Expression.Error",
    Message = "We cannot convert the value null to type Number.",
    Detail = [
        Value = null,
        Type = type number
    ]
]

UDF

( x as number ) as number => x
( ( x as number ) as number => x )(1) = 1   // true
( ( x as nullable number ) => x )( null ) = null    // true
( ( x as nullable number ) as nullable number => x )( null )    // true
( ( x as number ) as number => x )( null )  // Expression.Error
------
[
    Reason = "Expression.Error",
    Message = "We cannot convert the value null to type Number.",
    Detail = [
        Value = null,
        Type = type number
    ]
]
( x as any ) =>
    List.First(
        List.Skip(
            {
                [Type = type table,   Value = "Table"],
                [Type = type record,  Value = "Record"],
                [Type = type list,    Value = "List"],
                [Type = type number,  Value = "Number"],
                [Type = type logical, Value = "Logical"],
                [Type = type text,    Value = "Text"],
                [Type = type null,    Value = "Null"],
                [Type = type any,     Value = "Any"]
            },
            each not Type.Is( Value.Type( x ), _[Type] )
        )
    )[Value]

その他

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?