JetBrains Rider 2026.1 Help

SQL でのコードインスペクション

このトピックでは、SQL で利用可能なすべての JetBrains Rider コードインスペクション を一覧表示します。

エディター | インスペクション設定 | インスペクション重大度 | 他の言語 設定ページ  Ctrl+Alt+S で、特定のインスペクションを切り替えたり、その重要度レベルを変更できます。

インスペクション

説明

デフォルトの重大度

デフォルト値なしで非 null 列を追加

レポートは、DEFAULT 値なしで NOTNULL 列を作成しようとします。

例 (Microsoft SQL Server):

CREATE TABLE foo (a INT, b INT) ALTER TABLE foo ADD c INT NOT NULL;

デフォルトでは、列は NULL 値を保持します。 この例では、列に NULL 値を受け入れないように強制する NOTNULL 制約を使用します。 NULL 値の使用を禁止する場合は、新しいレコードを作成するときに SQL が使用できる DEFAULT 値を設定する必要があります。

ALTER TABLE foo ADD c INT NOT NULL DEFAULT 42;

Add DEFAULT value クイックフィックスを使用すると、DEFAULT 値をすばやく追加できます。

警告​​ 警告

集約関連の問題

SQL 集計関数の無効な使用箇所を報告します。

次の状況が考慮されます。

  • HAVING および ORDER BY 句で使用されているが、GROUP BY 句では欠落している列。

    CREATE TABLE foo(id INT PRIMARY KEY, a INT, b INT); SELECT a, MAX(b) FROM foo GROUP BY a HAVING b > 0; SELECT * FROM foo GROUP BY a ORDER BY b;

    この規則は、グループ化が主キーによって行われる場合には適用されません。

    SELECT * FROM foo GROUP BY id ORDER BY b;
  • 集約関数が不適切なコンテキストで使用されています。 通常、集約関数は次のコンテキストで使用できます:SELECT の式のリスト、HAVING および ORDER BY のセクション、その他ダイアレクト固有の場合。 次のクエリでエラーが表示されます。

    SELECT a FROM foo WHERE MAX(b) > 0; SELECT a FROM foo GROUP BY MAX(a);
  • 集約関数のネストされた呼び出し。

    SELECT MAX(SUM(a)) FROM foo GROUP BY a;

    このルールは分析関数には適用されません。 次のクエリは有効で正しいです。

    SELECT MAX(SUM(a) OVER ()) FROM foo;
  • 集約関数なしの HAVING の使用箇所。 この場合、WHERE セクションを使用してコードを書き直すことを検討してください。

    SELECT a, MAX(b) FROM foo GROUP BY a HAVING a > 0;

警告​​ 警告

あいまいな参照

名前は同じですが、異なるテーブルに属する列をレポートします。

例(MySQL):

CREATE TABLE foo(id INT PRIMARY KEY); CREATE TABLE bar(id INT PRIMARY KEY); SELECT foo.id, bar.id FROM foo, bar WHERE id > 0;

id 列は、 foo テーブルと bar テーブルに表示されます。 クエリを正しくするには、列名を修飾する必要があります。

SELECT foo.id, bar.id FROM foo, bar WHERE foo.id > 0;

警告​​ 警告

自動インクリメントの重複

自動増分が設定された 2 つの列を含むテーブルを報告します。 MySQL、Microsoft、SQL Server、Db2 ダイアレクトでは、テーブルには自動増分オプションを持つフィールドを 1 つだけ含めることができ、そのフィールドはキーである必要があります。

例(MySQL):

CREATE TABLE my_table ( id INT AUTO_INCREMENT, c2 INT AUTO_INCREMENT, );

c1 にはすでにこの制約があるため、 c2 の AUTO_INCREMENT 制約がハイライトされます。 警告を修正するには、 id をプライマリキーにして、 c2 の AUTO_INCREMENT を削除します。

CREATE TABLE my_table ( id INT AUTO_INCREMENT PRIMARY KEY, c2 INT, );

警告​​ 警告

using 句のカラムを確認

両方のテーブルに存在しない USING 句の列を報告します。

例(MySQL):

CREATE TABLE t1 (i INT, j INT); CREATE TABLE t2 (k INT, l INT); SELECT * FROM t1 JOIN t2 USING (j);

USING 句では、列名が両方のテーブルに存在する必要があり、SELECT クエリは、指定された列名を使用してそれらのテーブルを自動的に結合します。 t2 には j 列がないため、ON を使用してクエリを書き換えることができます。 ON 句は、両方のテーブルで列名が一致しないテーブルを結合できます。

SELECT * FROM t1 JOIN t2 ON t1.j = t2.l;

警告​​ 警告

エイリアスによってシャドーされた列

FROM 句の列名と一致する名前の SELECT エイリアスを報告します。

例(MySQL):

CREATE TABLE foo (a INT, b INT, c INT); SELECT a b, c FROM foo;

a 列は b エイリアスを使用しますが、 b 名は foo テーブルの列でも使用されます。

警告​​ 警告

列は Group By 句に含める必要があります

GROUP BY 句または集計関数呼び出し内にない列を報告します。

例 (Microsoft SQL Server):

CREATE TABLE t1 (a INT, b INT); SELECT a, b FROM t1 GROUP BY a;

SELECT クエリを実行すると、Microsoft と SQL Server は GROUP BY の b 列を期待しているか、集計関数内で使用されているため、エラーが発生します。 次の 2 つの例でこのエラーを修正できます。

SELECT a, b FROM t1 GROUP BY a, b; SELECT a, max(b) max_b FROM t1 GROUP BY a;

警告​​ 警告

定数条件

常に TRUE または常に FALSE である WHERE または JOIN 句の条件を報告します。

例(MySQL):

CREATE TABLE t1 (a TEXT, b INT, c BOOLEAN); SELECT a FROM t1 WHERE 'Cat' = 'Cat';

'Cat' = 'Cat' は常に真であり、報告されます。

警告​​ 警告

定数式

常に true、false、null である条件と式を報告します。

例(MySQL):

CREATE TABLE t1 (a TEXT, b INT, c BOOLEAN); SELECT a FROM t1 WHERE 'Cat' = 'Cat'; SELECT a FROM t1 WHERE 'Cat' = null;

'Cat' = 'Cat' は常に真であり、報告されます。

'Cat' = null は常に null であり、報告されます。

警告​​ 警告

現在のコンソールスキーマに対する内部検査

イントロスペクトされていない現在のセッションのスキーマとデータベースをレポートします。

例: この警告は、イントロスペクトされていないスキーマにテーブルを作成しようとしたときに発生する可能性があります。

イントロスペクションは、データソースをインスペクションする方法です。 イントロスペクションを実行すると、データソースの構造情報がインスペクションされ、属性を持つテーブル、列、関数、その他の要素が検出されます。

警告​​ 警告

where 句のない delete または update ステートメント

WHERE 句のない DELETE または UPDATE ステートメントの使用状況を報告します。

WHERE 句がない場合、DELETE はテーブルからすべてのデータを削除し、UPDATE はすべてのテーブル行の値を上書きします。

例(MySQL):

CREATE TABLE t1 (a TEXT, b INT, c BOOLEAN); update t1 set a = 'Smith'; delete from t1;

警告​​ 警告

使用すべきではない型

非推奨であり、DBMS の将来のバージョンでなくなる可能性のあるタイプの使用状況を報告します。

報告されたタイプ:

例(Oracle):

CREATE TABLE ot.foo( a NUMBER GENERATED BY DEFAULT AS IDENTITY, b LONG NOT NULL );

警告​​ 警告

SELECT 内の列名重複

SELECT リストの列エイリアスの重複した名前を報告します。

例(Sybase ASE):

CREATE TABLE t1 (a TEXT, b INT, c INT); SELECT a AS x, b AS x FROM t1;

x エイリアス名は、 a 列と b 列に使用されます。 Sybase ASE の列に同一のエイリアス名を使用できないため、これらの割り当てはエラーとしてハイライトされます。

警告​​ 警告

各派生テーブルにはエイリアスが必要です

エイリアスのない派生テーブルをレポートします。

例(MySQL):

CREATE TABLE table1 (id INT, name VARCHAR(20), cats FLOAT); CREATE TABLE table2 (id INT, age INTEGER); SELECT id AS ID, name, cats, age FROM (SELECT table1.id, name, cats, age FROM table1 JOIN table2 ON table1.id = table2.id);

dev.mysql.com の派生テーブル(英語)によると、エイリアスは必須です。 Introduce エイリアスクイックフィックスを使用してエイリアスを追加できます。

クイックフィックスが適用された後:

SELECT id AS ID, name, cats, age FROM (SELECT table1.id, name, cats, age FROM table1 JOIN table2 ON table1.id = table2.id);

警告​​ 警告

関数のシグネチャー

組み込み関数の署名の問題を報告します。

インスペクションは、間違った数の引数、無効なキーワード、間違ったデータ型、その他の問題を報告します。

例(MySQL):

CREATE TABLE foo (a INT, b INT, c INT) SELECT IFNULL() FROM foo; -- error SELECT IFNULL(a) FROM foo; -- error SELECT IFNULL(a, b) FROM foo; -- OK SELECT IFNULL(a, b, c) FROM foo; -- error

MySQL では、 IFNULL() 関数は厳密に 2 つの引数を受け入れます。 SELECT IFNULL(a, b) FROM foo; クエリのみが正しいです。

警告​​ 警告

引用符で囲む必要がある識別子

クエリで識別子名として SQL 予約キーワードを使用する場合の状況を報告します。

例 (Microsoft SQL Server):

CREATE TABLE select (identity INT IDENTITY NOT NULL, order INT NOT NULL);

selectidentityorder をテーブル名やカラム名として使用します。 ただし、これらは Microsoft SQL サーバーでは予約キーワードでもあります。 そのため、クエリでオブジェクト名として使うには、これらの識別子を引用符で囲む必要があります。 これらに引用符を付けるには、「識別子を引用符で囲む」クイックフィックスを利用できます。

クイックフィックスが適用された後:

CREATE TABLE [select] ([identity] INT IDENTITY NOT NULL, [order] INT NOT NULL);

警告​​ 警告

不正な日付 / 時間リテラル

日付と時刻のリテラルのエラーを報告します。 このインスペクションは、MySQL、Oracle、Db2、H2 で使用できます。

例(MySQL):

SELECT TIME '10 -12:13:14' FROM dual; SELECT TIME ' 12 : 13 : 14 ' FROM dual; SELECT TIME '12 13 14' FROM dual; SELECT TIME '12-13-14' FROM dual; SELECT TIME '12.13.14' FROM dual; SELECT TIME '12:13:' FROM dual; SELECT TIME '12:13' FROM dual; SELECT TIME '12:' FROM dual;

この例では、日付は MySQL 標準の日付と時刻のリテラルを無視します。 それらはハイライトされます。 MySQL の日付と時刻のリテラルの詳細については、「dev.mysql.com の日付と時刻のリテラル(英語) 」を参照してください。

次の日付とタイプのリテラルは MySQL で有効です。

SELECT TIME '12:13:14' FROM dual; SELECT TIME '12:13:14.555' FROM dual; SELECT TIME '12:13:14.' FROM dual; SELECT TIME '-12:13:14' FROM dual; SELECT TIME '10 12:13:14' FROM dual; SELECT TIME '-10 12:13:14' FROM dual;

警告​​ 警告

不正なカーソルの状態

SQL ルーチン内の不正なカーソル状態を報告します。

  • ルーチンには CLOSE または FETCH ステートメントがありますが、カーソルが閉じている可能性があります。

  • ルーチンには OPEN ステートメントがありますが、カーソルが開かれている可能性があります。

例 (Microsoft SQL Server):

CREATE TABLE t(col INT); CREATE PROCEDURE foo() AS BEGIN DECLARE my_cursor CURSOR FOR SELECT * FROM t; DECLARE a INT; FETCH my_cursor INTO a; CLOSE my_cursor; END;

docs.microsoft.com で CLOSE(Transact-SQL)によると、CLOSE は開いているカーソルで発行する必要があり、CLOSE は、宣言されているだけのカーソルまたはすでに閉じられているカーソルでは許可されていません。 警告を修正するにはカーソルを開く必要があります。

CREATE PROCEDURE foo() AS BEGIN DECLARE my_cursor CURSOR FOR SELECT * FROM t; DECLARE a INT; OPEN my_cursor; FETCH my_cursor INTO a; CLOSE my_cursor; END;

警告​​ 警告

暗黙的な文字列の切り捨て

定義された文字数を超える変数を報告します。

例 (Microsoft SQL Server):

CREATE PROCEDURE test() AS BEGIN DECLARE myVarOk VARCHAR(5) = 'abcde'; DECLARE myVarExceeded VARCHAR(5) = 'abcde12345'; SET myVarOk = 'xyz'; SET myVarExceeded = '123456789'; END;

myVarExceeded 変数は VARCHAR(5) として定義されていますが、割り当てられた値('abcde12345''123456789' )の両方がこの制限を超えています。 割り当てられた値を切り捨てたり、定義された長さを増やしたりすることができます。 長さを増やすには、Increase 型の長さクイックフィックスを使用します。

クイックフィックスが適用された後:

CREATE PROCEDURE test() AS BEGIN DECLARE myVarOk VARCHAR(5) = 'abcde'; DECLARE myVarExceeded VARCHAR(10) = 'abcde12345'; SET myVarOk = 'xyz'; SET myVarExceeded = '123456789'; END;

警告​​ 警告

カラムに依存するインデックス

インデックス付きテーブルから列を削除しようとしたケースを報告します。 このインスペクションは、Microsoft、SQL Server、Sybase ASE で使用できます。

例 (Microsoft SQL Server):

CREATE TABLE test_index ( col INT NOT NULL, col2 INT NOT NULL, col3 INT NOT NULL UNIQUE, col4 VARCHAR(200) ); CREATE UNIQUE INDEX aaaa ON test_index (col, col2); ALTER TABLE test_index DROP COLUMN col;

col 列はインデックス付きテーブルにあるため、削除できません。 列を削除するには、最初に aaaa インデックスを削除する必要があります(たとえば、DROP INDEX aaaa)。

警告​​ 警告

NOT NULL 列への NULL の挿入

NOTNULL 値のみを受け入れる列に NULL 値を挿入した場合を報告します。

例 (Microsoft SQL Server):

CREATE TABLE br2 ( id INT NOT NULL, col1 NVARCHAR (20) NOT NULL, col2 NVARCHAR (20) NOT NULL, ); -- INSERT INTO br2 (id, col1, col2) VALUES (1, NULL, NULL);

非 null として定義されているため、 col1 および col2 に NULL 値を挿入することはできません。 スクリプトをそのまま実行すると、エラーが発生します。 このコードを修正するには、VALUES 部分の NULL をいくつかの値(たとえば、 42 および 'bird' )に置き換えます。

INSERT INTO br2 (id, col1, col2) VALUES (1, 42, 'bird');

警告​​ 警告

生成列への挿入

生成された列に値を割り当てる INSERT ステートメントをレポートします。 生成された列は読み取ることができますが、その値を直接書き込むことはできません。

例(PostgreSQL):

CREATE TABLE foo ( col1 INT, col2 INT GENERATED ALWAYS AS (col1 + 1) STORED ); INSERT INTO foo(col1, col2) VALUES (1, 2);

この列は生成されるため、 2col2 列に挿入することはできません。 このスクリプトを機能させるには、 2 を DEFAULT に変更できます。

INSERT INTO foo(col1, col2) VALUES (1, DEFAULT);

警告​​ 警告

誤解を招く参照

SQL コードのあいまいな参照を報告します。

例: 名前がテーブル列とルーチンパラメーターの両方を参照している場合。 このようなコードを実行すると、直感に反する解決ロジックが原因でエラーや予期しない結果が発生する可能性があります。 通常、よりローカルなスコープを持つ名前の方が優先されます。

例(PostgreSQL):

CREATE TABLE foo ( id INT, name VARCHAR(5) ); CREATE FUNCTION func(name VARCHAR(5)) RETURNS INT AS $$ DECLARE b INT; BEGIN -- `name` is ambiguous as it is used as a column name and a parameter SELECT COUNT(*) INTO b FROM foo t WHERE t.name = name; RETURN b; END; $$ LANGUAGE plpgsql;

PostgreSQL では、 #variable_conflict ディレクティブを使用して、正しい参照を明示的に指定できます。 例: #variable_conflict use_column を使用して列名を参照するか、 #variable_conflict use_variable を使用してパラメーターを参照します。

CREATE TABLE foo ( id INT, name VARCHAR(5) ); CREATE FUNCTION func(name VARCHAR(5)) RETURNS INT AS $$ #variable_conflict use_column DECLARE b INT; BEGIN SELECT COUNT(*) INTO b FROM foo t WHERE t.name = name; RETURN b; END; $$ LANGUAGE plpgsql;

警告​​ 警告

列エイリアスがありません

出力式(たとえば、SELECT ステートメント)に明示的なエイリアスがないクエリをレポートします。

例(PostgreSQL):

CREATE TABLE foo(a INT, b INT); SELECT 1, a + 1 AS A2, MAX(b) AS M FROM foo;

無効

return ステートメントの欠落

RETURN ステートメントのない関数を報告します。

例(Oracle):

CREATE FUNCTION foo RETURN int AS BEGIN END;

foo 関数は整数値を返す必要がありますが、関数本体は何も返しません。 エラーを修正するには、RETURN ステートメント(たとえば、 return 1; )を追加します。

CREATE FUNCTION foo RETURN int AS BEGIN RETURN 1; END;

エラー エラー

クエリ内の複数の行数制限またはオフセット指定

1 つのクエリで複数の行制限句の使用状況を報告します。

例 (Microsoft SQL Server):

create table foo(a int); select top 1 * from foo order by a offset 10 rows fetch next 20 rows only;

SELECT TOP 句は、1 つのレコードのみを返す必要があることを指定するために使用されます。 FETCH 句は、OFFSET 句が処理された後に返される行数を指定します。 ただし、すでに SELECT TOP 制限句があるため、FETCH 句は冗長になる可能性があります。

警告​​ 警告

名前付き引数を使用してください

ルーチン呼び出しで名前なしで使用される引数を報告します。 デフォルトでは、このインスペクションは無効になっています。

名前付きパラメーターと名前なしパラメーターの違いの詳細については、「docs.microsoft.com での名前によるパラメーターのバインド(名前付きパラメーター) 」を参照してください。

例 (Microsoft SQL Server):

CREATE FUNCTION foo(n INT, m INT) RETURNS INT AS BEGIN RETURN n + m; END; CREATE PROCEDURE test AS BEGIN foo n = 1, m = 2; --- The following call misses parameter names and will be highlighted foo 1, 2; END;

foo 1, 2; 呼び出しのパラメーター 1, 2 は、名前が欠落しているためハイライトされています。

無効

データソースが構成されていません

データベースツールウィンドウ(表示 | ツールウィンドウ | データベース)にデータソースがないことを報告します。

警告​​ 警告

null 比較

ISNULL または ISNOTNULL 演算子で置き換えることができる NULL との比較を報告します。

例 (Microsoft SQL Server):

CREATE TABLE foo ( id int ); SELECT * FROM foo WHERE NULL = NULL; SELECT * FROM foo WHERE NULL != NULL;

NULL = NULLIS NULL に置き換えることができ、 NULL != NULLIS NOT NULL と比較できます。 この置換を行うには、Use ISNULL 演算子または UseIS NOTNULL 演算子クイックフィックスを使用できます。

SELECT * FROM foo WHERE NULL IS NULL; SELECT * FROM foo WHERE NULL IS NOT NULL;

警告​​ 警告

冗長な ELSE NULL 句

冗長な ELSENULL 句を報告します。

例(MySQL):

SELECT CASE WHEN 2 > 1 THEN 'OK' ELSE NULL END AS alias FROM foo;

ELSE NULL 部分は実行されないため、省略できます。

警告​​ 警告

冗長なエイリアス式

テーブル内の列の名前を複製し、冗長である可能性があるエイリアス式を報告します。

例(PostgreSQL):

CREATE TABLE foo(a INT, b INT); SELECT * FROM foo foo(a, b); SELECT * FROM foo foo(a); SELECT * FROM foo foo(x); SELECT * FROM foo foo(x, y);

最初の 2 つのエイリアスは、 foo テーブルと同じ列名を使用します。 それらは列名が同一であるため、冗長であると見なされます。

警告​​ 警告

COALESCE 呼び出し内の冗長なコード

COALESCE 関数で NULL と評価されない最初の式を除くすべての引数を報告します。

例(MySQL):

SELECT COALESCE(NULL, NULL, NULL, 42, NULL, 'string') as a;

最初の NOTNULL 引数は 42 であり、他のすべての引数はグレー表示されます。

警告​​ 警告

冗長な並べ替えの指定

ORDER BY 句で ASC や DESC などの冗長な順序付けの方向を報告します。

例(MySQL):

CREATE TABLE foo(a INT, b INT, c INT); SELECT * FROM foo ORDER BY a ASC, b DESC, c ASC;

ORDER BY キーワードは、デフォルトでレコードを昇順でソートします。 a 列と c 列の ASC キーワードは冗長です。

警告​​ 警告

クエリ内の冗長な行数制限

クエリで FETCH や LIMIT などの冗長な行制限句を報告します。

例(PostgreSQL):

CREATE TABLE foo(a INT); SELECT * FROM foo WHERE EXISTS(SELECT * FROM foo LIMIT 2); SELECT * FROM foo WHERE EXISTS(SELECT * FROM foo FETCH FIRST 2 ROWS ONLY);

警告を修正するには、LIMIT 句に OFFSET を追加できます。 OFFSET がない場合、LIMIT は冗長なものになります。LIMIT の使用は EXISTS の動作結果に影響を与えません。 OFFSET を使う場合、最初の N 行をスキップするため、出力に影響します。

SELECT * FROM foo WHERE EXISTS(SELECT * FROM foo OFFSET 1 ROW LIMIT 2); SELECT * FROM foo WHERE EXISTS(SELECT * FROM foo OFFSET 1 ROW FETCH FIRST 2 ROWS ONLY);

警告​​ 警告

SQL ダイアレクトの検出

ダイアレクトが SQL ファイルに割り当てられていない状況を報告します。

例: ダイアレクトを割り当てずに新しい SQL ファイルを開くと、最も一致するダイアレクトがアドバイスされる通知が表示されます。 <ダイアレクト> を使用リンクをクリックして、アドバイスされたダイアレクトを使用します。 または、ダイアレクトを変更リンクをクリックして、他のダイアレクトを選択します。

警告​​ 警告

SQL ソース変更の検出

データベースオブジェクトのソースコードが変更された場合の状況を報告します。

インスペクションは、データベースまたはオブジェクトのイントロスペクションを実行するとトリガーされます。 イントロスペクションは、オブジェクトのソースコードを開き、ステートメントを実行し、コードのリファクタリングを実行するときに実行されます。 また、オブジェクトを右クリックしてリフレッシュを選択すると、イントロスペクションを実行できます。

インスペクションは、次の状況をカバーします。

  • データベース内のオブジェクトソースコードが変更されましたが、エディター内のコードは更新されませんでした。 PostgreSQL、Microsoft、SQL Server、Oracle、Sybase ASE で動作します。

  • オブジェクトのソースコードを変更し、データベースをイントロスペクトしましたが、ソースコードはすでに他の誰かによって変更されています。

  • データベースイントロスペクターは IDE で更新されたため、以前のイントロスペクターバージョンでは欠落していた新しいオブジェクトプロパティをダウンロードする必要があります。

警告​​ 警告

副作用のあるステートメント

読み取り専用接続中にデータベースの変更につながる可能性のあるステートメントを報告します。

接続の読み取り専用モードを有効にするには、データベースツールウィンドウ(表示、ツールウィンドウ、データベース)でデータソースを右クリックし、プロパティを選択します。 データソースとドライバーダイアログで、オプションタブをクリックし、読み取り専用チェックボックスをオンにします。

例(MySQL):

CREATE TABLE foo(a INT); INSERT INTO foo VALUES (1);

CREATE TABLE および INSERT INTO ステートメントはデータベースの変更につながるため、これらのステートメントは読み取り専用接続モードでハイライトされます。

警告​​ 警告

疑わしいトリガー内のコード

トリガーでの遷移表変数の誤った使用箇所を報告します。

例(HSQLDB):

CREATE TABLE foo(a INT); CREATE TRIGGER trg AFTER DELETE ON foo BEGIN SELECT * FROM NEW; END; CREATE TRIGGER trig AFTER INSERT ON foo REFERENCING OLD ROW AS newrow FOR EACH ROW WHEN (a > 1) INSERT INTO foo VALUES (1)

HSQLDB では、DELETE トリガーは OLD 状態でのみ使用できますが、INSERT トリガーは NEW 状態でのみ使用できます。 前の例では、 SELECT * FROM NEW; の NEW と、 REFERENCING OLD ROW AS newrow の OLD がハイライトされます。

警告​​ 警告

型の互換性

タイプ関連のエラーを報告します。

警告​​ 警告

SQL 内の Unicode の使用箇所

N 接頭辞のない国別文字を使用する文字列リテラルを報告します。

N 接頭辞がないと、文字列はデータベースのデフォルトのコードページに変換されます。 このデフォルトのコードページでは、特定の文字が認識されない場合があります。 詳細については、 docs.microsoft.com の nchar および nvarchar(Transact-SQL)を参照してください。

例 (Microsoft SQL Server):

SELECT 'abcde' AS a; SELECT N'abcde' AS b; SELECT 'абвгд' AS c; SELECT N'абвгд' AS d;

SELECT 'абвгд' AS c; には N 接頭辞がなく、 'абвгд' 部分がハイライトされます。

警告​​ 警告

到達不能コード

SQL ルーチン内の到達不能なステートメントを報告します。

例 (Microsoft SQL Server):

CREATE FUNCTION foo() RETURNS INT AS BEGIN THROW; RETURN 1; END;

Microsoft SQL Server では、 THROW 文が例外を発生させ、TRY...CATCH 構文の CATCH ブロックに実行を移します。 RETURN 1; 部分は実行されません。

警告​​ 警告

未解決の参照

未解決の SQL 参照を報告します。

例(MySQL):

CREATE TABLE users(id INT, name VARCHAR(40)); CREATE TABLE admins(id INT, col1 INT); SELECT users.id, admins.id FROM admins WHERE admins.id > 1;

FROM 句に users テーブルがないため、 users.id 列は未解決です。

エラー エラー

'delete' ステートメントの安全でない 'join' 句

データベース全体を変更する可能性のあるステートメントの欠落している条件チェックを報告します。

例: ON または WHERE なしの DELETE ステートメント内での JOIN 句の使用。 JOIN の条件付きチェックがない場合、DELETE はテーブル全体の内容をドロップします。

例(MySQL):

CREATE TABLE foo (a INT,b INT,c INT); CREATE TABLE bar (a INT,b INT,c INT); DELETE table1 FROM foo table1 INNER JOIN bar table2;

警告​​ 警告

未使用の共通テーブル式

クエリ内の未使用の共通テーブル式(CTE)を報告します。

例(PostgreSQL):

CREATE TABLE foo(a INT); WITH a AS (SELECT 1 AS x FROM foo) SELECT 1 + 2 FROM foo;

WITH を使うことで、 a という名前の一時的な命名済み結果セット(共通テーブル式(CTE)とも呼ばれます)を作成します。 ただし、この CTE は以降のコードで使用されていません。 未使用の CTE はグレー表示されます。

警告​​ 警告

未使用のサブクエリ項目

外部クエリ式で参照されていない列、エイリアス、その他のサブクエリ項目をレポートします。

例(PostgreSQL):

CREATE TABLE for_subquery(id INT); SELECT a, q FROM (SELECT 1 AS a, 10 AS b, 2 + 3 AS q, id FROM for_subquery) x;

サブクエリから a および q エイリアスを参照します。 ただし、 b エイリアスと id 列は、外部の SELECT ステートメントでは参照されていません。 bid はグレー表示されます。

警告​​ 警告

未使用の変数

未使用の引数、変数、パラメーターを報告します。

例(PostgreSQL):

CREATE FUNCTION foo(PARAMUSED INT, PARAMUNUSED INT) RETURNS INT AS $$ BEGIN RETURN PARAMUSED; END $$ LANGUAGE plpgsql;

PARAMUNUSED パラメーターは関数で使用されていないため、削除される可能性があります。

警告​​ 警告

GOTO ステートメントの使用箇所

ループを終了するために使用される後方 GOTO ステートメントおよび GOTO ステートメントの使用状況を報告します。

GOTO ステートメントを広範囲に使用することは、一般的に推奨されません。 詳細については、 ibm.com の SQL プロシージャーの GOTO ステートメント(英語)を参照してください。

GOTO を使用して前のステートメントに戻る代わりに、ループの使用を検討してください。

GOTO で WHILE ループを終了する代わりに、他の制御フローステートメント(たとえば、RETURN または BREAK)の使用を検討してください。

例(Oracle):

CREATE PROCEDURE test(n INT) AS DECLARE x INT; BEGIN x := 0; GOTO a; <<a>> x := 1; IF (n = 0) THEN GOTO a; END IF; WHILE TRUE LOOP GOTO b; END LOOP; <<b>> x := 3; END;

無効

トリガー内でトランザクション管理ステートメントを使用

トリガー本体での COMMIT や ROLLBACK などのトランザクション管理ステートメントの使用状況を報告します。

トリガー本体に COMMIT または ROLLBACK ステートメントがある場合、トリガーはコンパイルされません。 トリガーはトランザクション中に開始されるため、失敗が発生します。 トリガーが開始しても、現在のトランザクションはまだ完了していません。 COMMIT がトランザクションを終了すると、両方のステートメント(COMMIT と ROLLBACK)が例外になります。 トリガーで実行される変更は、トリガーを開始した所有トランザクションによってコミット(またはロールバック)される必要があります。

例(Oracle):

CREATE TABLE employee_audit ( id INT NOT NULL, update_date DATE NOT NULL, old_name VARCHAR2(100), new_name VARCHAR2(100) ); CREATE TABLE employees ( id INT NOT NULL, name VARCHAR2(100) NOT NULL ); CREATE OR REPLACE TRIGGER trig_commit AFTER UPDATE OF name ON employees FOR EACH ROW BEGIN INSERT INTO employee_audit VALUES (:old.id, SYSDATE, :old.name, :new.name); COMMIT; END; CREATE OR REPLACE TRIGGER trig_rollback AFTER UPDATE OF name ON employees FOR EACH ROW BEGIN INSERT INTO employee_audit VALUES (:old.id, SYSDATE, :old.name, :new.name); ROLLBACK; END;

警告​​ 警告

COALESCE 関数の代わりに CASE を使用 (およびその逆)

CASE と合体の呼び出しが相互に置き換え可能な状況を報告します。 このインスペクションには次のインテンションアクションがあります:『合体』呼び出しに置き換え、または逆に CASE 式に置き換えます。

例(MySQL):

SELECT -- this CASE may be replaced by COALESCE CASE WHEN C1 IS NOT NULL THEN C1 ELSE 0 END FROM dual;

この例では、CASE ステートメントを同じ出力を生成する SELECT COALESCE(C1, 0) に置き換えることができます。

CASE 式を使用する場合は、インスペクションページの COALESCE よりも CASE 式を優先する関数オプションを選択します。

警告​​ 警告

条件関数の代わりに CASE を使用 (およびその逆)

CASE と IF が交換可能な状況を報告します。

例(MySQL):

SELECT CASE WHEN C1 IS NULL THEN 1 ELSE 0 END FROM dual;

コードを短くするために、CASE 構造を IF に置き換えることができます。 これを行うには、「IF」呼び出しインテンションアクションで置換を適用します。 サンプルコードは次のようになります。

SELECT IF(C1 IS NULL, 1, 0) FROM dual;

IF を CASE に戻すには、IF をクリックして、Replace withCASE 式インテンションアクションを適用します。

警告​​ 警告

名前付き引数および位置指定引数の使用

位置引数が名前付き引数の後に続く呼び出しを報告します。 PostgreSQL、Oracle、Db2 で動作します。

例(PostgreSQL の場合):

CREATE FUNCTION foo(a int, b int, c int) RETURNS int LANGUAGE plpgsql AS $$ BEGIN RETURN a + b + c; END $$; SELECT foo(a => 1, b => 2, c => 3); -- `3` goes after the named argument SELECT foo(1, b => 2, 3); -- `1` and `3` go after the named argument SELECT foo(b => 2, 1, 3);

エラー エラー

VALUES 句の多重度

VALUES のパラメーターの数がターゲットテーブルの列の数と一致しない状況を報告します。

例(MySQL):

CREATE TABLE foo(a INT, b INT, c INT); INSERT INTO foo VALUES (1,2,3,4)

foo テーブルには 3 つの列がありますが、INSERT INTO ステートメントでは 4 つを渡します。

警告​​ 警告

2026 年 6 月 12 日