より大きなテーブルの一部として与えられた、ping可能なコンピューター名の列を含むテーブルがあります。コンピュータ名には、点線のドメイン名が含まれている場合や、IPアドレスである場合があります。コンピューター名とドメイン名をそれぞれの列に分ける必要があります。
例えば:
ComputerFullName | ComputerName | Domain
comp1 | |
1.2.0.1 | |
comp3.place.com | |
1.2.1.45.place.com | |
次のクエリを使用してドメインに入力できます。
UPDATE Example
SET Domain = SWITCH(
ComputerFullName LIKE '#*.#*.#*.#*.*', MID(ComputerFullName, INSTR(1, REPLACE(ComputerFullName, '.', ' ', 1, 3), '.') + 1)
, ComputerFullName LIKE '#*.#*.#*.#*', NULL
, INSTR(1, ComputerFullName, '.') <> 0, MID(ComputerFullName, INSTR(1, ComputerFullName, '.') + 1)
);
ComputerName列を更新するためにいくつかのクエリを試しましたが、最も有望なのは次のとおりです。
UPDATE Example
SET ComputerName = SWITCH(
ComputerFullName LIKE '#*.#*.#*.#*.*', LEFT(ComputerFullName, INSTR(1, ComputerFullName, Domain) - 2)
, ComputerFullName LIKE '#*.#*.#*.#*', ComputerFullName
, INSTR(1, ComputerFullName, '.') <> 0, LEFT(ComputerFullName, INSTR(1, ComputerFullName, '.') - 1)
, TRUE, ComputerFullName
);
これと他のすべての試みは、「MicrosoftOfficeAccessは更新クエリのすべてのレコードを更新できません...型変換の失敗のためにAccessは2つのフィールドを更新しませんでした...」というエラーを返しました。
結果のテーブルは次のようになります。
ComputerFullName | ComputerName | Domain
comp1 | |
1.2.0.1 | |
comp3.place.com | comp3 | place.com
1.2.1.45.place.com | 1.2.1.45 | place.com
私が欲しいテーブルは:
ComputerFullName | ComputerName | Domain
comp1 | comp1 |
1.2.0.1 | 1.2.0.1 |
comp3.place.com | comp3 | place.com
1.2.1.45.place.com | 1.2.1.45 | place.com
助言がありますか?
以下の回答を処理しているときに、上記のクエリが機能しない理由に気付きました。Accessは、条件がfalseの場合でも、SWITCHステートメントで可能な各値を評価します。このため、ドメインがない場合、LEFT関数の長さパラメーターは負の数でした。