programing

에서 순서 유지IN'절

padding 2023. 7. 12. 22:19
반응형

에서 순서 유지IN'절

'IN' 조건부 조항의 순서를 유지할 수 있습니까?

저는 SO에서 이 질문을 찾았지만 그의 예에서 OP는 이미 분류되었습니다.IN' 절.

제 경우는 다릅니다. 'IN' 절은 무작위 순서입니다. 이런 식입니다.

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)

(45,2,445,12,789) 순으로 결과를 찾고 싶습니다.오라클 데이터베이스를 사용하고 있습니다.SQL에 조건부 절에 사용할 수 있는 특성이 있을 수 있습니다. 절의 순서를 유지하도록 지정하기 위해 조건부 절을 사용할 수 있습니다.

ORDER BY 조항을 사용하지 않는 한 신뢰할 수 있는 주문은 없습니다.

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
order by case TestResult.SomeField
         when 45 then 1
         when 2  then 2
         when 445 then 3
         ...
         end

쿼리를 5개의 쿼리로 분할하여 모두 결합할 수 있지만...

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 4
union all
SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 2
union all
...

저는 이전 방법을 더 신뢰할 것이고, 아마도 훨씬 더 잘 수행될 것입니다.

경우 대소문자 표현 대신 디코드 기능이 유용합니다.

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
ORDER BY DECODE(SomeField, 45,1, 2,2, 445,3, 12,4, 789,5)

값, 위치 쌍(예: 445,3)은 가독성을 위해 함께 보관됩니다.

사용해 보십시오.

SELECT T.SomeField,T.OtherField
FROM TestResult T
 JOIN 
   (
     SELECT 1 as Id, 45 as Val FROM dual UNION ALL
     SELECT 2, 2 FROM dual UNION ALL
     SELECT 3, 445 FROM dual UNION ALL
     SELECT 4, 12 FROM dual UNION ALL
     SELECT 5, 789  FROM dual
   ) I
   ON T.SomeField = I.Val
ORDER BY I.Id

문자열 함수를 사용하는 다른 방법이 있습니다.

with const as (select ',45,2,445,12,789,' as vals)
select tr.*
from TestResult tr cross join const
where instr(const.vals, ','||cast(tr.somefield as varchar(255))||',') > 0
order by instr(const.vals, ','||cast(tr.somefield as varchar(255))||',')

중간 테이블보다 일련의 값을 유지하는 것이 더 쉬울 수 있기 때문에 이를 제안합니다.

(SQL Server 2016 사용)를 사용하여 애플리케이션에서 이 작업을 수행할 수 있었습니다.

select ItemID, iName
  from Items
      where ItemID in (13,11,12,1)
      order by CHARINDEX(' ' + Convert("varchar",ItemID) + ' ',' 13 , 11 , 12 , 1 ')

코드 사이드 정규식을 사용하여 대체했습니다.\b(단어 경계)를 공백으로 표시합니다.뭐랄까...

var mylist = "13,11,12,1";
var spacedlist = replace(mylist,/\b/," ");

중요한 것은 시나리오에서 다음에 관련 항목이 업데이트될 때까지 결과를 캐시하므로 쿼리가 각 항목 보기가 아닌 항목 생성/수정 시에만 실행되므로 성능 저하를 최소화할 수 있다는 점입니다.

집합을 통해 값을 전달합니다(SYS.ODCINUMBERLIST는 기본 제공 컬렉션의 예입니다). 그런 다음 컬렉션의 순서에 따라 행을 정렬합니다.

SELECT t.SomeField,
       t.OtherField
FROM   TestResult t
       INNER JOIN (
         SELECT ROWNUM AS rn,
                COLUMN_VALUE AS value
         FROM   TABLE(SYS.ODCINUMBERLIST(45,2,445,12,789))
       ) i
       ON t.somefield = i.value
ORDER BY rn

그런 다음 표본 데이터의 경우:

CREATE TABLE TestResult ( somefield, otherfield ) AS
SELECT   2, 'A' FROM DUAL UNION ALL
SELECT   5, 'B' FROM DUAL UNION ALL
SELECT  12, 'C' FROM DUAL UNION ALL
SELECT  37, 'D' FROM DUAL UNION ALL
SELECT  45, 'E' FROM DUAL UNION ALL
SELECT 100, 'F' FROM DUAL UNION ALL
SELECT 445, 'G' FROM DUAL UNION ALL
SELECT 789, 'H' FROM DUAL UNION ALL
SELECT 999, 'I' FROM DUAL;

출력은 다음과 같습니다.

썸필드 기타 필드
45 E
2 A
445 G
12 C
789 H

만지작거리다

언급URL : https://stackoverflow.com/questions/14139931/keep-order-from-in-clause

반응형