VALUES (SQL)
構文
(field1{,fieldn})
VALUES (value1{,valuen})
概要
VALUES 節は INSERT 文、UPDATE 文、または INSERT OR UPDATE 文で使用され、フィールドに挿入するデータ値を指定します。通常は、以下のとおりです。
-
INSERT クエリは、以下の構文を使用します。
INSERT INTO tablename (fieldname1,fieldname2,...) VALUES (value1,value2,...)
-
UPDATE クエリは、以下の構文を使用します。
UPDATE tablename (fieldname1,fieldname2,...) VALUES (value1,value2,...)
VALUES 節の要素は、テーブル名の後で指定されているフィールドに連続して対応します。VALUES 節で 1 つの値だけが指定されている場合は、要素を括弧で囲む必要はありません。
以下の例は、単独の行を "Employee" テーブルに追加する INSERT 文を示しています。
INSERT INTO Employee (Name,SocSec,Telephone)
VALUES("Boswell",333448888,"546-7989")
INSERT INTO Employee (Name,SocSec,Telephone)
VALUES ('Boswell',333448888,'546-7989')
INSERT クエリと UPDATE クエリは、テーブル名の後にフィールド名のリストを明示的に指定せずに、VALUES 節を使用できます。テーブル名の後でフィールド名のリストを省略するには、クエリが次の 2 つの基準を満たしている必要があります。
-
VALUES 節で指定されている値の数は、テーブル内のフィールドの数と同じです (ID フィールドは除く)。
-
VALUES 節の値は、列 2 から始まるフィールドの内部列番号の順序でリストされます。列 1 は常にシステムによって作成された ID フィールド用として使用されるので、VALUES 節では指定されません。
例えば、以下にクエリがあります。
INSERT INTO Sample.Person VALUES (5,'John')
以下に別のクエリがあります。
INSERT INTO Sample.Person (Age,Name) VALUES (5,'John')
テーブル "Sample.Person" が 2 つのユーザ定義のフィールドを持っている場合、上と下のクエリは等しくなります。
この例では、値 5 が下位番号の列フィールドに割り当てられており、値 "John" がもう 1 つのフィールドに割り当てられています。
VALUES 節は、以下の埋め込み SQL の例のように配列の要素を指定できます。
&sql( UPDATE Person(Tel)
VALUES :per('tel',)
WHERE ID = :id )
また、UPDATE クエリは、指定されていない最後の部分文字列を持つ配列を参照できます。したがって、INSERT は配列要素の有無を使用して、値と既定値を新規に作成された行に割り当てます。UPDATE は配列要素の存在を使用して、対応するフィールドが更新されることを示します。例えば、以下のような 6 列のテーブルに対する配列があるとします。
emp("profile",2)="Smith" emp("profile",3)=2 emp("profile",3,1)="1441 Main St." emp("profile",3,2)="Cableton, IL 60433" emp("profile",5)=NULL emp("profile",7)=25 emp("profile","next")="F"
列 1 は常に ID フィールド用のもので、ユーザ定義ではありません。挿入された "Employee" 行は列 2 の "Name" を "Smith" に設定し、列 3 の "Address" が 2 行の値を持つように設定し、列 4 の "Department" はここでは指定されていないので既定値に設定し、そして列 5 の "Location" は NULL に設定します。"Location" の既定値は、対応する配列要素が NULL 値で定義されているので、使用されません。配列要素 "7" と "next" は、"Employee" テーブルの列番号に対応しないので、クエリによって無視されます。ここでは、この配列を使用する UPDATE 文を示しています。
&sql(UPDATE Employee
VALUES :emp('profile',)
WHERE Employee = 379)
上記の定義と配列値により、この文は RowID = 379 である "Employee" 行の "Name" フィールド、"Address" フィールド、"Location" フィールドを更新します。
ただし、添え字を完全に省略すると SQLCODE -54 エラーが発生します。VALUES の後に (最後の添え字が省略された) 配列識別子が必要です。
例えば以下のように、複数の行を対象にした UPDATE クエリを持つ配列参照を使用することもできます。
&sql(UPDATE Employee
VALUES :emp('profile',)
WHERE Type = 'PART-TIME')
VALUES 節変数は、ドット構文を使用できません。したがって、以下の埋め込み SQL の例では正常に動作します。
SET sname = state.Name
&sql(INSERT INTO StateTbl VALUES :sname)
以下は不適切です。
&sql(INSERT INTO State VALUES :state.Name)
NULL と空白文字列値は異なります。詳細は "NULL" を参照してください。後方互換性では、古い既存データ内にあるすべての空白文字列 ('') 値は NULL 値と見なされます。新規データでは、空白文字列は $CHAR(0) としてデータ内に保存されます。SQL では、NULL は 'NULL' と記述されます。以下はその例です。
INSERT INTO Sample.Person
(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John',NULL)
SQL では、空白文字列は '' (2 つの一重引用符) と記述されます。以下はその例です。
INSERT INTO Sample.Person
(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John','')
ID フィールドに NULL 値は挿入できません。
引数
field
フィールド名、またはコンマで区切られたフィールド名のリスト。
value
値、あるいはコンマで区切られた値のリスト。各値は対応するフィールドに割り当てられています。
例
以下の例は、"Doe,John" のレコードを Sample.Person テーブルに挿入します。次に、このレコードを選択して、このレコードを削除します。2 番目の SELECT で削除を確認します。
INSERT INTO Sample.Person (Name,SSN,Home_City) VALUES ("Doe,John","123-45-6789","Metropolis")
SELECT Name,SSN,Home_City FROM Sample.Person WHERE Name ="Doe,John"
DELETE FROM Sample.Person WHERE Name="Doe,John"
SELECT Name,SSN FROM Sample.Person WHERE Name='Doe,John'