$vector (ObjectScript)
Synopsis
set $vector(vector,position,type) = value
$vector(vector,position)
$vector(vector,startPosition,endPosition)
$vector(vector,startPosition,*)
$vector(vector,startPosition,* - offset)
kill $vector(vector,position)
説明
$vector 関数は、ベクトル内の要素に値を割り当て、要素を削除することもできます。指定したベクトル要素の位置の値、または要素位置のサブセットからのベクトル・スライスを返すこともできます。ベクトルに対して操作を実行するには、$vectorop 関数を使用します。
ベクトルとは、データベースの列を格納する InterSystems IRIS® データ構造です。ベクトルの各要素は同じデータ型となります。$vector を使用して列指向データにアクセスすると、分析クエリやその他のオンライン分析処理 (OLAP) トランザクションを、従来の行ベース (リスト) クエリより桁違いに高速化できます。
省略形 : $ve |
ベクトル・データの割り当て
-
set $vector(vector,position,type) = value は、指定したインデックス位置にあるベクトル要素を指定した値に割り当てます。要素は指定したデータ型です。有効なデータ型は、"integer" (または "int")、"double"、"decimal"、"string"、および "timestamp" です。
-
vector が定義されていない場合、$vector 関数はベクトルを作成し、データ型を設定して、要素の値を割り当てます。例えば、次のコードは、"integer" 型のベクトルを作成し、3 番目の要素に値 10 を割り当てます。1 番目と 2 番目の要素は未定義です。
set $vector(vector,3,"integer") = 10
-
vector が既に定義されている場合、$vector 関数は要素の値を割り当てます。type は以前に定義されたベクトルのデータ型に設定する必要があります。例えば、"double" 型のベクトルで set $vector(vector,1,"integer") = 3 を呼び出すと、<VECTOR> エラーが発生します。
-
ベクトル・データを返す
-
$vector(vector,position) は、指定したインデックス位置にあるベクトル要素の値を返します。例えば、次のコードは、ベクトルの 2 番目の要素の値を変数 x に割り当てます。
set x = $vector(vector,2)
-
$vector(vector,startPosition,endPosition) は、元のベクトルのインデックス位置 startPosition と endPosition の間の要素を含む、新しいベクトルを返します。例えば、次のコードは、元のベクトルの 3 番目から 5 番目の要素を含むベクトルを、変数 vector2 に格納します。
set vector2 = $vector(vector,3,5)
返されるベクトルは、元のベクトルと同じ型になります。
-
$vector(vector,startPosition,*) は、インデックス位置 startPosition からベクトルの末尾までの要素を含む、新しいベクトルを返します。アスタリスク (*) はベクトルの最後の要素を表します。例えば、次のコードは、4 番目の位置以降のすべての要素を含むベクトルを、変数 vector2 に格納します。
set vector2 = $vector(vector,4,*)
-
$vector(vector,startPosition,* - offset) は、インデックス位置 startPosition から、ベクトルの末尾から位置の offset 数を引いた位置までの要素を含む、新しいベクトルを返します。例えば、次のコードは、4 番目の位置から、最後から 2 番目の位置までのすべての要素を含むベクトルを、変数 vector2 に格納します。
set vector2 = $vector(vector,4,* - 1)
例 : ベクトルからのデータの取得
ベクトル・データの削除
引数
vector
入力ベクトルを指定するグローバル変数またはローカル変数。
-
vector がベクトルではない ($isvector(vector) = 0) 場合、$vector は <VECTOR> エラーを発生させます。
-
vector が未定義であるか、空の文字列 ("") を保持している場合は、次のようになります。
-
$vector は空の文字列を返します。
-
set $vector(vector,position,type) = value は、指定した引数を持つ新しいベクトルを vector に割り当てます。
-
kill $vector(vector,position) は、操作を行いません。
-
position
割り当てたり、返したり、削除したりするベクトル要素の位置を指定する正の整数。position が 1 より小さい場合、$vector は <VECTOR> エラーを発生させます。
position がベクトルの長さを超える場合、$vector の動作は操作によって異なります。
範囲外の位置でのベクトル操作 | 結果 |
---|---|
set $vector(vector,position) = value | value を position にあるベクトル要素に割り当て、ベクトルの長さを position まで増加させます。元の長さと新しい長さの間の位置にある値は未定義のままです。 |
$vector(vector,position) | 空の文字列 ("") を返します。 |
kill $vector(vector,position) | 操作を行いません。 |
位置をアスタリスク (*) として指定することもできます。これは、最後に割り当てたベクトルの位置を指定するのと同じです。
type
ベクトルのデータ型。次の文字列のいずれかとして指定されます。
ベクトルの型 | ベクトル要素 | 対応する SQL タイプ |
---|---|---|
"integer" または "int" | 整数 | BIGINT |
"double" | IEEE 倍精度 (64 ビット) バイナリ浮動小数点データ型に変換された数値。この形式の詳細は、"$double" を参照してください。 | DOUBLE |
"decimal" | InterSystems IRIS の 10 進数の浮動小数点データ型に変換された数値。この形式の詳細は、"$decimal" を参照してください。 | DECIMAL |
"string" | 最大長 N の文字列。N より長い文字列を指定すると、<ILLEGAL VALUE> エラーが発生します。 | VARCHAR |
"timestamp" | 整数ベースの日付時刻形式。この形式の詳細は、"%Library.PosixTimeOpens in a new tab" を参照してください。
タイムスタンプの操作例は、"タイムスタンプ・ベクトルの格納と表示" を参照してください。 |
POSIXTIME |
vector に割り当てられるすべての要素はこのデータ型になります。
value
ベクトル要素に割り当てる値。value をベクトルに格納する前に、$vector 関数は、標準の ObjectScript の型の変換規則を使用して、この値を指定した type に変換します。例えば、次のテーブルは、格納された 3.14 の value が、データ型によってどのように変化するかを示しています。
割り当てられたベクトル値 | 格納されたベクトル値 |
---|---|
set $vector(vector,1,"integer") = 3.14 |
3 |
set $vector(vector,1,"double") = 3.14 |
3.1400000000000001243 この不正確さは、浮動小数点データの格納における制限によるものです。 |
set $vector(vector,1,"decimal") = 3.14 |
3.14 |
set $vector(vector,1,"string") = 3.14 |
"3.14" |
set $vector(vector,1,"timestamp") = 3.14 |
3 |
ObjectScript の変換規則の詳細は、"変数のタイプと変換" を参照してください。
startPosition
返すベクトル・スライスの最初のインデックス位置を指定する正の整数。
$vector(vector,startPosition,endPosition) 構文は、startPosition 要素と endPosition 要素の間の vector 要素を含む、新しいベクトルを返します。新しいベクトルの長さは endPosition から startPosition を引いたものとなります。新しいベクトルのすべての要素は、元のベクトルの要素と同じ型となります。
$vector 関数は、次の条件において、空の文字列 ("") を返します。
-
endPosition は startPosition より小さい。
-
startPosition は、最後に定義された vector 要素の位置より大きい。
-
startPosition と endPosition の間にはいずれの要素も定義されていない。
endPosition
返すベクトル・スライスの最後のインデックス位置を指定する正の整数。
$vector(vector,startPosition,endPosition) 構文は、startPosition 要素と endPosition 要素の間の vector 要素を含む、新しいベクトルを返します。新しいベクトルの長さは endPosition から startPosition を引いたものとなります。新しいベクトルのすべての要素は、元のベクトルの要素と同じ型となります。
endPosition がベクトルの長さを超える場合、$vector 関数は、startPosition からベクトルの末尾までの要素を返します。この場合、アスタリスク構文 (*) を使用してベクトルの末尾を指定するのと同じになります。例えば、次のコードで、ベクトル v1 と v2 はどちらも、vector の 4 番目と 5 番目の要素のみを含みます。
for i=1:1:5 set $vector(vector,i,"integer") = $random(100)+1
set v1 = $vector(vector,4,10)
set v2 = $vector(vector,4,*)
$vector 関数は、次の条件において、空の文字列 ("") を返します。
-
endPosition は startPosition より小さい。
-
startPosition と endPosition の間にはいずれの要素も定義されていない。
offset
ベクトル・スライスの最後のインデックス位置をオフセットする要素の数を指定する整数。アスタリスク構文 (*) を指定した offset を使用すると、最後のベクトル要素を基準にしたスライスを返します。例えば、$vector(vector,1,*-1) は、2 番目から最後までの要素を返し、$vector(vector,1,*-2) は、3 番目から最後までの要素を返します。
例
ベクトルの作成とベクトル要素の更新
3 要素の文字列ベクトルを作成し、zwrite コマンドを使用してベクトルのコンテンツを表示します。ベクトルの型は "string" に設定され、ベクトルの作成後に変更することはできません。要素数とベクトル長さはどちらも 3 に設定されます。
set $vector(v,1,"string") = "a"
set $vector(v,2,"string") = "b"
set $vector(v,3,"string") = "c"
zwrite v
v={"type":"string", "count":3, "length":3, "vector":["a","b","c"]} ; <VECTOR> |
ベクトルから 2 番目の要素を削除します。要素数は 2 に減少します。ベクトル長さは最後に定義された要素の位置と等しいため、これは 3 のままです。要素 1 ("a") と 3 ("c") の間のコンマが連続していることから、位置 2 の要素は未定義となったことがわかります。
kill $vector(v,2)
zwrite v
v={"type":"string", "count":2, "length":3, "vector":["a",,"c"]} ; <VECTOR> |
位置 10 に新しい要素を追加します。ベクトル数は 3 に増加し、ベクトル長さは 10 に増加します。位置 4 から 9 の要素は未定義です。
set $vector(v,10) = "d"
zwrite v
v={"type":"string", "count":3, "length":10, "vector":["a",,"c",,,,,,,"d"]} ; <VECTOR> |
位置 10 の値を更新します。ベクトルの長さと数は変わりませんが、$vector 関数によって要素の値が更新されます。
set $vector(v,10) = "j"
zwrite v
v={"type":"string", "count":3, "length":10, "vector":["a",,"c",,,,,,,"j"]} ; <VECTOR> |
ループでベクトルを更新し、欠落した要素を追加します。$char 関数を使用して、小文字の ASCII コードを文字列表現に変換します。これで、ベクトルの最初の 10 個の要素が定義されました。
set asciiOffset = 96 // lowercase letters start with ASCII code 97
for i = 1:1:10 set $vector(v,i) = $char(i + asciiOffset)
zwrite v
v={"type":"string", "count":10, "length":10, "vector":["a","b","c","d","e","f","g","h","i","j"]} ; <VECTOR> |
ベクトルからのデータの取得
1 から 100 までのランダムな整数を含む 10 個の要素のベクトルを作成します。zwrite コマンドを使用して、コンテンツを表示します。出力は変化します。
for i = 1:1:10 set $vector(v1,i,"integer") = $random(100)+1
zwrite v1
v1={"type":"integer", "count":10, "length":10, "vector":[89,40,20,99,32,61,55,34,19,47]} ; <VECTOR> |
ベクトルのさまざまな要素を変数に設定します。返り値はベクトルと同じ型となります (この場合は integer)。範囲外の要素は例外で、空の文字列に設定されます。
set element1 = $vector(v1,1)
set element2 = $vector(v1,2)
set element100 = $vector(v1,100)
zwrite element1, element2, element100
element1=89 element2=40 element100="" |
ベクトルの最初の 5 つの要素を取得します。ベクトルから連続する要素の範囲を取得するには、それらの値のみを含む新しいベクトルを返します。このベクトルはベクトル・スライスと呼ばれることもあります。
set v2 = $vector(v1,1,5)
zwrite v2
v2={"type":"integer", "count":5, "length":5, "vector":[89,40,20,99,32]} ; <VECTOR> |
元のベクトルから 1 番目の要素を削除し、再度、最初の 5 つの要素を取得します。返されるベクトル・スライスには 5 つの要素が含まれますが、1 番目の要素は未定義です。
kill $vector(v1,1)
set v2 = $vector(v1,1,5)
zwrite v2
v2={"type":"integer", "count":4, "length":5, "vector":[,40,20,99,32]} ; <VECTOR> |
元のベクトルから 5 番目の要素を削除し、再度、最初の 5 つの要素を取得します。返されるベクトル・スライスには未定義の要素 5 は含まれません。これは、この要素がベクトルの最後にあるためです。
kill $vector(v1,5)
set v2 = $vector(v1,1,5)
zwrite v2
v2={"type":"integer", "count":3, "length":4, "vector":[,40,20,99]} ; <VECTOR> |
元のベクトルの要素 6 から、最後から 2 番目の要素までを取得します。これらの要素を新しいベクトルに格納します。* を基準にして最後から 2 番目の要素を指定します。* は最後のベクトル要素のインデックス位置を参照します。
set v3 = $vector(v1,6,*-1)
v3={"type":"integer", "count":4, "length":4, "vector":[61,55,34,19]} ; <VECTOR> |
ベクトルの最後の要素を取得し、範囲外の末尾の位置を指定します。$vector 関数は、元のベクトルの最後の要素のみを含む 1 要素のベクトルを返します。
set v4 = $vector(v1,*,100)
v4={"type":"integer", "count":1, "length":1, "vector":[47]} ; <VECTOR> |
タイムスタンプ・ベクトルの格納と表示
ベクトルは、タイムスタンプを Posix 時刻と呼ばれる (Unix 時刻や Epoch 時刻と呼ばれることもあります) 整数ベースの形式にエンコードします。各整数は、1970 年 1 月 1 日 00:00:00 以降 (または以前) の秒数です。この形式の詳細は、"%Library.PosixTimeOpens in a new tab" を参照してください。
現在の時刻を 5 秒間、1 秒ずつの増分で取得します。$datetime 関数を使用して時刻を Posix 形式に変換します。この関数での変換コードは -2 です。これらの時刻をベクトルに格納し、ベクトルのコンテンツを表示します。時刻は変化します。
set posix = -2
for i=1:1:5 set $vector(v,i,"timestamp") = $zdatetime($now(),posix) hang 1
zwrite v
v={"type":"timestamp", "count":5, "length":5, "vector":[1639672461,1639672463,1639672464,1639672465,1639672466]} ; <VECTOR> |
ベクトルに格納されている時刻を読み取り可能な形式で表示します。
for i=1:1:5 set ts=$vector(v,i) write !,$zdatetime($zdatetimeh(ts,posix))
12/16/2021 11:34:21 12/16/2021 11:34:23 12/16/2021 11:34:24 12/16/2021 11:34:25 12/16/2021 11:34:26 |
%Library.PosixTimeOpens in a new tab の LogicalToDisplay メソッドと DisplayToLogical メソッドを使用して、タイムスタンプ表示を変換することもできます。例えば、次のルーチンは、未加工のタイムスタンプ日付を Posix 時刻形式に変換し、そのタイムスタンプ日付をベクトルに格納して、それを読み取り可能な形式で表示します。
set dates = "10/10/2010 10:10:10;11/11/2011 11:11:11;12/12/2012 12:12:12"
set delimiter = ";"
set $vector(v) = "timestamp"
set numDates = $length(dates,delimiter)
for i = 1:1:numDates
{
set dateString = $piece(dates,delimiter,i)
set datePosix = ##class(%Library.PosixTime).DisplayToLogical(dateString)
set $vector(v,i) = datePosix
write !,##class(%Library.PosixTime).LogicalToDisplay($vector(v,i))
}