質問
選択するフィールドを示すパラメータを使用してストアドプロシージャを作成したい。
E.g。 2つのパラメーター" selectField1"を渡したいおよび&select; 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-nother ソリューション(両方ではありません)です。出力に両方のフィールドを含める可能性が必要な場合は、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,
選択中
ただし、プログラムでその列を表示しないだけではありませんか?
これを行うnoobの方法:
SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE
if-elseを実行するプログラミング言語でのみ、この情報を適切に管理できます。
ASP / JavaScriptの例
// Code to retrieve the ADODB.Recordset
if (rs("field1")) {
do_the_stuff_a();
}
if (rs("field2")) {
do_the_stuff_b();
}
rs.MoveNext();
所属していません StackOverflow