[SQL] ()는 SQL IN의 값의 순서에 의해 절을 주문
SQL()는 SQL IN의 값의 순서에 의해 절을 주문
IN () 절에있는 값의 순서에 의해 주문 (아마도 더 좋은 방법) 거리가 있는지 궁금하고있다.
문제는 내가 2 개 쿼리, 모든 ID와 두 번째를 검색하는 모든 정보가를 얻을 수 하나를 가지고있다. 첫째는 I로 구입 번째 원하는 ID의 순서를 생성한다. ID는 올바른 순서에 IN () 절에 배치됩니다.
그것은 (매우 간단) 같은 것 그래서 :
SELECT id FROM table1 WHERE ... ORDER BY display_order, name
SELECT name, description, ... WHERE id IN ([id's from first])
문제는 두 번째 쿼리는 ID가 IN () 절에 투입되는 동일한 순서로 결과를 반환하지 않습니다.
내가 찾은 하나의 해결책은 다음 두 번째 쿼리에 가입되어 자동 증가 필드 임시 테이블에 모든 ID를 넣어하는 것입니다.
더 나은 옵션이 있습니까?
참고 : 첫 번째 쿼리는 "사용자"를 실행하고, 두 번째는 백그라운드 프로세스로 실행되기 때문에, 서브 쿼리를 사용하여 2 일에 쿼리를 결합 할 수있는 방법이 없습니다.
내가 MySQL을 사용하고,하지만 난 그것뿐만 아니라 다른 DB를 거기에 어떤 옵션을 언급하는 것이 유용 할 수있다 생각하고 있어요.
해결법
-
==============================
1.사용 MySQL은 FIELD () 함수 :
사용 MySQL은 FIELD () 함수 :
SELECT name, description, ... FROM ... WHERE id IN([ids, any order]) ORDER BY FIELD(id, [ids in order])
FIELD ()는 (첫 번째 파라미터 자체 이외) 첫번째 파라미터와 동일하다 제 파라미터의 인덱스를 반환 할 것이다.
FIELD ( 'A', 'A', 'B', 'C')
1을 반환합니다
FIELD ( 'A', 'C', 'B', 'A')
3을 반환합니다
당신이 IN () 절과 같은 순서로 FIELD () 함수로 ID를 붙여 넣으면이 정확히 당신이 원하는 것을 할 것입니다.
-
==============================
2.정렬 된 데이터를 가져 오는 방법은 다음을 참조하십시오.
정렬 된 데이터를 가져 오는 방법은 다음을 참조하십시오.
SELECT ... FROM ... WHERE zip IN (91709,92886,92807,...,91356) AND user.status=1 ORDER BY provider.package_id DESC , FIELD(zip,91709,92886,92807,...,91356) LIMIT 10
-
==============================
3.봄이 마음에 두 개의 솔루션 :
봄이 마음에 두 개의 솔루션 :
(INSTR ()는 오라클에서이며, 어쩌면 당신은 (위치) 또는 charIndex에 () 또는 같은 한)
-
==============================
4.ANS는 정렬 된 데이터를 얻을 수 있습니다.
ANS는 정렬 된 데이터를 얻을 수 있습니다.
SELECT ... FROM ... ORDER BY FIELD(user_id,5,3,2,...,50) LIMIT 10
-
==============================
5.당신은 MS SQL 서버 2008+에서 쿼리가 입력 한 값을 사용하여 쿼리에 임의의 정렬을 수행 할 경우, 즉석에서 테이블을 작성하고 그렇게 (OP에서 명칭을 사용)과 같은 조인 수행하여 수행 할 수 있습니다.
당신은 MS SQL 서버 2008+에서 쿼리가 입력 한 값을 사용하여 쿼리에 임의의 정렬을 수행 할 경우, 즉석에서 테이블을 작성하고 그렇게 (OP에서 명칭을 사용)과 같은 조인 수행하여 수행 할 수 있습니다.
SELECT table1.name, table1.description ... FROM (VALUES (id1,1), (id2,2), (id3,3) ...) AS orderTbl(orderKey, orderIdx) LEFT JOIN table1 ON orderTbl.orderKey=table1.id ORDER BY orderTbl.orderIdx
당신은 같은 일을하지만, ANSI SQL에서 뭔가와 VALUES 문을 교체 할 경우, 다음이 어떤 SQL 데이터베이스에서 작동합니다.
노트 : 레코드를 쿼리하는 단계 (100)보다 큰 정도를 설정할 때 생성 된 테이블 (orderTbl.orderIdx)의 두 번째 열이 필요하다. 나는 원래 orderIdx 열을 가지고 있지만, 100보다 큰 결과 세트로 I가 명시 적으로 해당 열을 기준으로 정렬 한 것으로 나타하지 않았다; 에서 SQL Server Express에 2014 어쨌든.
-
==============================
6.
SELECT ORDER_NO, DELIVERY_ADDRESS from IFSAPP.PURCHASE_ORDER_TAB where ORDER_NO in ('52000077','52000079','52000167','52000297','52000204','52000409','52000126') ORDER BY instr('52000077,52000079,52000167,52000297,52000204,52000409,52000126',ORDER_NO)
정말 좋은 일
-
==============================
7.IN 절 값의 집합을 설명하고, 세트 순서가 없습니다.
IN 절 값의 집합을 설명하고, 세트 순서가 없습니다.
조인 후 display_order 열을 주문하면 가장 가까운 올바른 솔루션과 솔루션; 다른 건 아마 DBMS 고유의 해킹 (또는 표준 SQL의 OLAP 기능을 몇 가지 물건을하고있다). 물론 상기 가입 가장 가까운 휴대용 용액 (비록 display_order 값 데이터를 생성하는 것은 문제가 될 수 있음)이다. 당신이 주문 열을 선택해야 할 수도 있습니다; 나는 그것이 (SQL-92로 어쩌면 오래 전) 얼마 전에 원칙적으로 완화되었다 생각하지만, 표준 SQL의 요구 사항이 될하는 데 사용.
-
==============================
8.Oracle의 경우, 존의 솔루션은 INSTR () 함수의 작품을 사용. 여기서 일한 약간 다른 솔루션입니다 - SELECT ID 표 FROM WHERE 번호 (1, 20, 45, 60) ORDER BY의 INSTR ( '1, 20, 45, 60', ID)
Oracle의 경우, 존의 솔루션은 INSTR () 함수의 작품을 사용. 여기서 일한 약간 다른 솔루션입니다 - SELECT ID 표 FROM WHERE 번호 (1, 20, 45, 60) ORDER BY의 INSTR ( '1, 20, 45, 60', ID)
-
==============================
9.사용 MySQL의 FIND_IN_SET 기능 :
사용 MySQL의 FIND_IN_SET 기능 :
SELECT * FROM table_name WHERE id IN (..,..,..,..) ORDER BY FIND_IN_SET (coloumn_name, .., .., ..);
-
==============================
10.내 첫번째 생각은 단일 쿼리를 작성했지만, 하나는 사용자가 실행하고 다른 백그라운드에서 실행되기 때문에이 방법을 사용할 수없는했다. 어떻게 백그라운드 프로세스로 사용자로부터 전달하는 ID의 목록을 저장하는? 왜 순서를 의미하는 열이있는 임시 테이블에 넣어 없습니다.
내 첫번째 생각은 단일 쿼리를 작성했지만, 하나는 사용자가 실행하고 다른 백그라운드에서 실행되기 때문에이 방법을 사용할 수없는했다. 어떻게 백그라운드 프로세스로 사용자로부터 전달하는 ID의 목록을 저장하는? 왜 순서를 의미하는 열이있는 임시 테이블에 넣어 없습니다.
어떻게 이것에 대해 이렇게 :
-
==============================
11.난 당신이 가입하면 간단 할 것입니다하는 방식으로 데이터를 저장하기 위해 관리해야한다고 생각하고 더 해킹 및 복잡한 일이 진행되지 않도록 그것은 완벽 할 것입니다.
난 당신이 가입하면 간단 할 것입니다하는 방식으로 데이터를 저장하기 위해 관리해야한다고 생각하고 더 해킹 및 복잡한 일이 진행되지 않도록 그것은 완벽 할 것입니다.
내가 예를 들어 트랙 ID의 "최근 경기"목록을 가지고, SQLite는에 단순히 수행
SELECT * FROM recently NATURAL JOIN tracks;
-
==============================
12.난 그냥 이렇게 노력) 우리가 (FIELD이없는 경우 MS SQL 서버입니다 :
난 그냥 이렇게 노력) 우리가 (FIELD이없는 경우 MS SQL 서버입니다 :
SELECT table1.id ... INNER JOIN (VALUES (10,1),(3,2),(4,3),(5,4),(7,5),(8,6),(9,7),(2,8),(6,9),(5,10) ) AS X(id,sortorder) ON X.id = table1.id ORDER BY X.sortorder
내가 너무 중복을 허용하고 있습니다.
-
==============================
13.이것을 샷 보내기
이것을 샷 보내기
SELECT name, description, ... WHERE id IN (SELECT id FROM table1 WHERE...) ORDER BY (SELECT display_order FROM table1 WHERE...), (SELECT name FROM table1 WHERE...)
알의 아마 제대로 작동 상관 하위 쿼리를 얻기 위해 약간의 조정이 걸릴 것입니다,하지만 기본 원리는 소리를해야합니다.
from https://stackoverflow.com/questions/396748/ordering-by-the-order-of-values-in-a-sql-in-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL은 - VS 어디를 가진 (0) | 2020.03.10 |
---|---|
[SQL] 절 단락 평가 된 SQL인가? (0) | 2020.03.10 |
[SQL] IN 성능 대 MYSQL OR (0) | 2020.03.10 |
[SQL] 오라클의 다중 행 삽입을 할 수있는 가장 좋은 방법은? (0) | 2020.03.10 |
[SQL] 열 값을 기준으로 선택 출력 값 - 문 'SELECT'을의 'IF' (0) | 2020.03.10 |