문제

케이스를 사용하지 않고 구조를 사용하는 경우 케이스를 사용하는 Transact SQL 문을 다시 작성하는 방법이 있습니까?

내장 쿼리 디자이너와 자체 의사 SQL이있는 제품을 사용하고 있습니다. SQL Server 및 Oracle에서 사용할 수있는 내용에는 제한이 있습니다. 따라서 기본 데이터베이스가 Oracle 일 때 Decode (지원되는)를 사용하는이 열이 있습니다. 그러나 SQL Server에서 작동하고 지원되지 않는 경우 Case를 사용해야합니다.

내가 변환하려는 진술은 같은 것입니다

Decode (StatusColumn,  'Value 1',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 2',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 3',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 4')

옵션이 아닌 경우 사용할 T-SQL 옵션 세트와 케이스가 제한되어 있습니다. 나는 Isnull과 Coalesce를 가지고 있지만, 그들이 이것에 도움이 될지 확실하지 않습니다.

날짜 계산에 신경 쓰지 마십시오. 해결됩니다.

여기에 질문이 없을 때 사건을 검색했습니다.

감사!

업데이트:

나는 개발자의 자원이며 이것이 개발 제품이라고 가정 할 것이기 때문에 한계의 이유에 대한 자세한 내용을 제한해야한다는 것을 알고 있습니다. 그렇지 않습니다.

내장 쿼리 디자이너와 자체 의사 SQL이있는 엔터프라이즈 소프트웨어 제품을 사용하고 있습니다. SQL Server 및 Oracle에서 사용할 수있는 내용에는 제한이 있습니다. 기본적으로, 내장 쿼리 엔진의 구문 분석을 깨뜨리지 않는 모든 것은 게임입니다. 즉, 모든 제재 된 기능 및 표현식과 모든 데이터 추상화 (데이터베이스의 물리적 테이블 및 제품으로 생성 된 기타 쿼리에 해당하는 내부 개체)와 Oracle SQL 또는 Parsing을 명시 적으로 깨뜨리지 않는 Transact SQL의 모든 것을 의미합니다. .

나에게 작동하지 않는 이유는 쿼리 엔진에 의해 의사 SQL의 구문 분석을 중단하기 때문입니다.

궁극적으로, 나는 다음을 시도하고 싶다.

  1. 제품의 쿼리 디자이너 만 사용하여 구문 분석을 전달하는 SQL 또는
  2. SQL Server 데이터베이스 및 쿼리 디자이너의 몇 가지 추가 리소스를 사용하여 완료하십시오.

내가 얻은 몇 가지 좋은 답변을 바탕으로, 지금까지 저를 위해 효과가있는 접근법이 있습니다.

Jason Defontes는 데이터베이스보기를 사용하여 규칙과 위의 #2로 떨어질 때 사례를 수행 할 수 있다고 제안했습니다. 보기는 역동적이기 때문에 역동적이기 때문에 그에 대한 유지 보수를 할 필요가 없기 때문에 (Richartallent의 진실 테이블 접근법과는 달리 Jason의 접근 방식에 가깝다고 생각합니다). 기능을 만드는 파스칼의 제안은 같은 줄을 따라 가지만 아마도 구문 분석을 깨뜨릴 것입니다.

그래서 쿼리의 SQL에 추가 할 때 케이스로 모든 변환을 수행하는 데이터베이스보기를 만들었고 기존 SQL과 결합하여 잘 작동했습니다. 데이터베이스 엔진에 오버 헤드를 추가하고 있다는 것을 알고 있습니다. 동일한 데이터 세트를 두 번 검색해야하므로 (보기의 경우와 쿼리의 경우) 문제가되지 않는 경우 중 하나입니다.

이 "견해를 사용하여 offuscate를 사용하여"디자인이 효과가 있다는 점을 감안할 때, 나는 더 효율적인 접근법이 무엇인지 궁금합니다.

  • 언제와 함께 선택을 사용하고;
  • CTE 사용 (다시, RichardTallent);
  • Union All (HLGEM) 사용;
  • 하위 쿼리 사용 (misterzimbu);

나는 아마도 위의 #1에 속할 수 있기 때문에 여전히 Aramis Wyler의 제안을 확인할 것입니다.

지금은 Jason의 답변이 받아 들여졌습니다. 내가 견해에있을 때 사례를 사용했다는 것을 고려할 때, 아마도 질문의 제목이 결국 선택되지 않았을 것입니다. 나는 그 과정에서 도움이되는 것을 제안한 모든 사람들을 상승시켰다. 그것이 당신의 명성에 차이가 있는지 모르겠지만, 나는 그것이 좋은 일이라고 생각했습니다.

다시, 나는 당신의 도움에 감사하고 당신이 쓰러진 질문에 대한 모든 것을 편집 해달라고 부탁하고 싶습니다 (내 첫 번째 질문이고 영어는 제 2 언어입니다).

도움이 되었습니까?

해결책

케이스를 이동할 수 있습니까?/로직이보기로 켜질 때 도구가보기를 쿼리하도록 할 수 있습니까?

다른 팁

모두 이용 가능한 노조가 있습니까? 아마도 Where 조항의 경우의 조건이있는 각 조건에 대한 쿼리를 작성하고 함께 통합 할 수 있습니다.

사용자 정의 하위 쿼리를 쓸 수 있습니까? 아마도 사건에 액세스 할 수 없다면 아마도 이것은 아마도 효과가있을 것입니다.

select
    ...,
    coalesce(c1.value, c2.value, c3.value, ..., <default value>)
from MyTable
left join (select <result 1> as value) c1 on <first condition>
left join (select <result 2> as value) c2 on <second condition>
left join (select <result 3> as value) c3 on <third condition>

case를 사용하여 계산을 수행하는 함수를 작성하십시오.

그것은 추악하고 당신이 가진 값의 수에 따라 실용적이지 않을 수 있습니다. 그러나 엄밀히 말하면, 나는 이와 같은 것이 위의 쿼리 세그먼트에서 번역으로 작용할 것이라고 생각합니다.

Where Now ()> targetDateColumn 및 (statusColumn = 'value 1'또는 StatersColumn = 'value 2'또는 StatersColumn = 'value 3') tablename에서 'pastdue'를 선택하십시오 'value 1'또는 statusColumn = 'value 2'또는 stertatsColumn = 'value 3') Union Select 'value 4'가 아닌 경우 (statusColumn = 'value 1'또는 StaterColumn = 'value 2'또는 stertatsColumn = 'value 3')

나는 당신의 코드를 이해하는지 확실하지 않지만, 이것은 당신에게 다른 접근법에 대한 아이디어를 제공해야합니다.

먼저 테이블을 만듭니다.

CREATE TABLE StatusLookup(
   value nvarchar(255),
   datesign shortint,
   result varchar(255));

이제 진실 테이블로 채우십시오 (여기에 반복되는 논리가 많이 있습니다.

INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 1, 'Past Due')

마지막으로 기본 답변을 제공하고 기본 답변을 제공하십시오.

SELECT mytable.*, COALESCE(statuslookup.result, 'Value 4')
FROM
    mytable LEFT JOIN statuslookup ON
        statuslookup.value = StatusColumn
        AND statuslookup.datesign = Sign(Now()-TargetDateColumn)

이 접근법의 주요 장점 중 하나는 비즈니스 로직을 코드가 아닌 데이터 테이블에 넣는다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top