選択するフィールドを示すパラメータを使用して、ストアドプロシージャを作成したいと思います。
例えば。 2つのパラメーター「selectField1」と「selectField2」をそれぞれブールとして渡したいと思います。
それから私は次のようなものが欲しい
SELECT
if (selectField1 = true) Field1 ELSE do not select Field1
if (selectField2 = true) Field2 ELSE do not select Field2
FROM Table
ありがとうカール
許可されたフィールドのみを返す機能が必要なようです。つまり、返されるフィールドの数も動的でなければなりません。これは2つの変数で機能します。それ以上のものは混乱を招きます。
IF (selectField1 = true AND selectField2 = true)
BEGIN
SELECT Field1, Field2
FROM Table
END
ELSE IF (selectField1 = true)
BEGIN
SELECT Field1
FROM Table
END
ELSE IF (selectField2 = true)
BEGIN
SELECT Field2
FROM Table
END
動的SQLは倍数化に役立ちます。この例では、少なくとも1列が真であると仮定しています。
DECLARE @sql varchar(MAX)
SET @sql = 'SELECT '
IF (selectField1 = true)
BEGIN
SET @sql = @sql + 'Field1, '
END
IF (selectField2 = true)
BEGIN
SET @sql = @sql + 'Field2, '
END
...
-- DROP ', '
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2)
SET @sql = @sql + ' FROM Table'
EXEC(@sql)
SQL
では、次のようにします。
SELECT CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END,
CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END
FROM Table
リレーショナルモデルは、動的フィールドカウントを意味しません。
代わりに、フィールド値に関心がない場合は、代わりにNULL
を選択してクライアントで解析します。
CASE
ステートメント が必要です:
SELECT
CASE
WHEN @SelectField1 = 1 THEN Field1
WHEN @SelectField2 = 1 THEN Field2
ELSE NULL
END AS NewField
FROM Table
編集:私の例は、提供されたパラメータに応じて、2つのフィールドを1つのフィールドに結合することです。それはone-or-neitherのソリューションです(両方ではありません)。出力に両方のフィールドを含める可能性が必要な場合は、Quassnoiのソリューションを使用してください。
@selectField1 AS bit
@selectField2 AS bit
SELECT
CASE
WHEN @selectField1 THEN Field1
WHEN @selectField2 THEN Field2
ELSE someDefaultField
END
FROM Table
これはあなたが探しているものですか?
これは擬似的な方法です
IF (selectField1 = true)
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
あなたが欲しいのは:
MY_FIELD=
case
when (selectField1 = 1) then Field1
else Field2
end,
選択で
ただし、プログラムでその列を表示しないだけではありませんか?