通常SQL文クエリを使用する場合、inクエリは間違いなく必須であり、そのほとんどは一部のデータ統計やテストクラスに使用されます。in クエリを、実際によく使用されるクエリ リストに含めることはお勧めできません。
この記事では主に、in query メソッドでのパラメーターの設定方法と、delimiter 関数を使用したカンマ区切り文字列のクエリ用データセットへの変換について簡単に説明します。
目次
1. 固定設定
SQL Server では、次の SQL ステートメントを使用して IN クエリを表現できます。
SELECT * FROM TableName WHERE ColumnName IN (value1, value2, value3)
このうち、TableNameはクエリしたいテーブルの名前、ColumnNameは照合したい列の名前、value1、value2、value3は照合したい値です。必要に応じて、カンマで区切られた複数の値を括弧で囲むことができます。
-- 查询名为customers的表中Name列值为'张三', '李四', '王五'的记录
SELECT * FROM customers WHERE Name IN ('张三', '李四', '王五')
これにより、「国」列の値が「Johnny」、「Lee」、または「King」である基準を満たすレコードが返されます。
SQL ステートメント内の値は、列のデータ型に従って適切に処理され、引用符で囲まれる必要があることに注意してください。文字列値の場合は、一重引用符または二重引用符で囲む必要があります。他のデータ型の場合は、対応する構文ルールに従って処理する必要があります。
2. パラメータ化された設定ダイナミクス
SQL Server では、パラメーター化されたクエリを使用して、IN クエリ条件を動的に設定できます。パラメータ化されたクエリでは、クエリ内で可変数のパラメータ値を使用できます。
using System.Data.SqlClient;
string connectionString = "YourConnectionString";
string query = "SELECT * FROM TableName WHERE ColumnName IN (@Values)";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
// 可变数量的参数值
List<int> parameterValues = new List<int> {
1, 2, 3, 4, 5 };
// 构建参数化查询参数
string parameterName = "@Values";
string valueList = string.Join(",", parameterValues.Select((_, i) => $"{
parameterName}{
i}"));
command.Parameters.AddWithValue(parameterName, valueList);
// 执行查询
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// 处理查询结果
}
reader.Close();
}
C# プログラミングでは、上記の例では、パラメーター化されたクエリの構築に使用されるパラメーター値を含むリスト (parameterValues) を入力として使用しました。string.Join メソッドを使用して、パラメーター名とインデックスをカンマ区切りの文字列に連結し、それをパラメーター値として IN 句に渡します。
注 パラメーター化されたクエリを構築する場合、SQL インジェクション攻撃を防ぐために、パラメーター値を SQL クエリ文字列に直接挿入するのではなく、パラメーター化されたクエリ パラメーターを使用してください。
注: プログラムを通じてパラメータ化する必要があります。そうでない場合、クエリは無効です。
3. 関数は動的パラメータを分離します
SQL Server では、カンマ区切りの文字列を IN 句で使用するデータセットに変換する場合、いくつかのトリックを使用できます。
一般的なアプローチは、分割関数を使用して文字列を行に分割し、それを一時テーブルまたはテーブル値関数への入力として使用することです。その後、この一時テーブルまたはテーブル値関数をクエリで使用して、ニーズを実現できます。
3.1. 分割関数の作成
分割関数を作成します。カスタム分割関数を作成することも、STRING_SPLIT 関数 (SQL Server 2016 以降でサポートされている) などの既存の分割関数を使用することもできます。
CREATE FUNCTION dbo.SplitString
(
@string NVARCHAR(MAX),
@delimiter NVARCHAR(10)
)
RETURNS @result TABLE (Value NVARCHAR(MAX))
AS
BEGIN
DECLARE @start INT,
@end INT
SET @start = 1
SET @end = CHARINDEX(@delimiter, @string)
WHILE @end > 0
BEGIN
INSERT INTO @result (Value)
SELECT SUBSTRING(@string, @start, @end - @start)
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
INSERT INTO @result (Value)
SELECT SUBSTRING(@string, @start, LEN(@string) - @start + 1)
RETURN
END
3.2. 転送データセットクエリ
Split 関数を使用して文字列をデータセットに変換し、それをクエリで使用します。
DECLARE @inputString NVARCHAR(MAX) = 'value1,value2,value3'
DECLARE @delimiter NVARCHAR(10) = ','
SELECT t.*
FROM TableName t
WHERE t.ColumnName IN (
SELECT Value
FROM dbo.SplitString(@inputString, @delimiter)
)
上記の例では、まず、入力パラメータが文字列と区切り文字である SplitString 分割関数を作成しました。この関数は文字列を行に分割し、結果を表形式で返します。
次に、入力されたカンマ区切り文字列を表す変数 @inputString と区切り文字を表す変数 @delimiter を宣言しました。クエリでは、SplitString 関数を使用して文字列をデータ セットに変換し、それをテーブル内の ColumnName 列と比較して、IN クエリの機能を実装します。
4. 一時テーブル方式
4.1. SQLの動的実行
SQL Server では、動的 SQL を使用して、動的に生成された SQL ステートメントを実行できます。動的 SQL を使用すると、実行時に SQL ステートメントを構築して実行でき、必要に応じてさまざまなクエリ条件を組み合わせることができます。
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM TableName WHERE ColumnName = @param'
DECLARE @param VARCHAR(100) = 'some_value'
EXEC sp_executesql @sql, N'@param VARCHAR(100)', @param
上の例では、動的に生成された SQL ステートメントを格納する変数 @sql を宣言しました。この SQL ステートメントではパラメーター @param が使用されており、必要に応じて置き換えることができます。
次に、変数 @param を宣言してパラメーターの値を指定します。次に、sp_executesql ストアド プロシージャを使用して動的 SQL ステートメントを実行します。ストアド プロシージャの最初のパラメータは動的 SQL ステートメント、2 番目のパラメータはパラメータの型と名前を定義する文字列、3 番目のパラメータは受信パラメータの実際の値です。
SQL インジェクション攻撃を防ぐために動的 SQL を使用する場合は、セキュリティに特別な注意を払う必要があることに注意してください。入力されたパラメータ値が適切に検証および処理されていることを確認するか、セキュリティを強化するためにパラメータ化されたクエリの使用を検討してください。
4.2. 一時テーブルへのデータの追加
SQL Server では、EXEC sp_executesql によって実行された結果セットは、INSERT INTO SELECT ステートメントを使用して一時テーブルに挿入できます。
-- 创建临时表
CREATE TABLE #TempTable (
Column1 INT,
Column2 VARCHAR(50)
)
DECLARE @sql NVARCHAR(MAX)
DECLARE @param INT = 1 -- 查询参数
-- 构建动态 SQL 语句
SET @sql = N'SELECT Column1, Column2 FROM YourTable WHERE Column3 = @param'
-- 执行动态 SQL 并将结果插入临时表
INSERT INTO #TempTable (Column1, Column2)
EXEC sp_executesql @sql, N'@param INT', @param
-- 查询临时表
SELECT *
FROM #TempTable
-- 删除临时表(可选)
DROP TABLE #TempTable
上記の例では、最初に一時テーブル #TempTable が作成され、クエリ結果セットと一致する列が定義されます。次に、sp_executesql を使用して動的 SQL ステートメントを実行し、INSERT INTO SELECT を通じて結果セットを一時テーブルに挿入します。最後に、#TempTable をクエリすることで結果セットを表示できます。
一時テーブルの使用後は、必要に応じて忘れずに削除してください。DROP TABLE ステートメントを使用して一時テーブルを削除し、関連リソースを解放できます。