문제
나는 것 같은 저장 프로시저를 만드는 매개변수를 나타내는 필드를 선택해야 합니다.
E.g.고 싶을 통과하는 두 개의 매개변수를"selectField1"및"selectField2"서로 bools.
그때 나는 뭔가
SELECT
if (selectField1 = true) Field1 ELSE do not select Field1
if (selectField2 = true) Field2 ELSE do not select Field2
FROM Table
감사 Karl
해결책
허용 된 필드 만 반환 할 수있는 능력을 원하는 것처럼 들리므로 반품 된 필드 수도 역동적이어야합니다. 이것은 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
편집 : 내 예제는 제공된 매개 변수에 따라 두 필드를 하나의 필드로 결합하는 것입니다. 이것은 하나 또는 나이 해결책 (둘 다 아님). 출력에 두 필드를 모두 가질 가능성을 원한다면 Quassnoi의 솔루션을 사용하십시오.
@selectField1 AS bit
@selectField2 AS bit
SELECT
CASE
WHEN @selectField1 THEN Field1
WHEN @selectField2 THEN Field2
ELSE someDefaultField
END
FROM Table
이것이 당신이 찾고있는 것입니까?
이것은 Psuedo 방식입니다
IF (selectField1 = true)
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
당신이 원하는 것은 :
MY_FIELD=
case
when (selectField1 = 1) then Field1
else Field2
end,
선택에서
그러나, 당신은 당신의 프로그램에 그 열을 보여주지 않습니까?
의 멍청한 방법으로 이렇게하려면:
SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE
이 정보를 관리할 수 있습에서 제대로 프로그래밍 언어만 하는 경우-다른 사람.
예제에서 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