[SQL] SQL 서버에 입력 된 방법을 순서대로 정렬?
SQLSQL 서버에 입력 된 방법을 순서대로 정렬?
나는 SQL 서버를 사용하고 난 결과를 찾을려고하지만 입력을 조건을 가지고 나는이 같은 순서로 결과를 얻을 싶습니다.
내 코드 :
SELECT
AccountNumber, EndDate
FROM
Accounts
WHERE
AccountNumber IN (212345, 312345, 145687, 658975, 256987, 365874, 568974, 124578, 125689) -- I would like the results to be in the same order as these numbers.
해결법
-
==============================
1.여기에 인라인 (in-line) 방식이다
여기에 인라인 (in-line) 방식이다
예
Declare @List varchar(max)='212345, 312345, 145687, 658975, 256987, 365874, 568974, 124578, 125689' Select A.AccountNumber ,A.EndDate From Accounts A Join ( Select RetSeq = Row_Number() over (Order By (Select null)) ,RetVal = v.value('(./text())[1]', 'int') From (values (convert(xml,'<x>' + replace(@List,',','</x><x>')+'</x>'))) x(n) Cross Apply n.nodes('x') node(v) ) B on A.AccountNumber = B.RetVal Order By B.RetSeq
RetSeq RetVal 1 212345 2 312345 3 145687 4 658975 5 256987 6 365874 7 568974 8 124578 9 125689
-
==============================
2.당신은이 가입으로 대체하고,이 같은 주문에 대한 필드를 설정할 수 있습니다 :
당신은이 가입으로 대체하고,이 같은 주문에 대한 필드를 설정할 수 있습니다 :
SELECT AccountNumber , EndDate FROM Accounts a JOIN ( SELECT 212345 AS Number, 1 AS SeqOrder UNION ALL SELECT 312345 AS Number, 2 AS SeqOrder UNION ALL SELECT 145687 AS Number, 3 AS SeqOrder UNION ALL ... -- and so on ) AS inlist ON inlist.Number = a.AccountNumber ORDER BY inlist.SeqOrder
-
==============================
3.나는 한 번 더 난 그냥 발견 접근하지만,이 요구에 v2016을 제공합니다. Regrettfully 개발자는 STRING_SPLIT ()의 결과 집합에 대한 인덱스를 포함하는 잊었지만이 일 것이고 설명되어 있습니다 :
나는 한 번 더 난 그냥 발견 접근하지만,이 요구에 v2016을 제공합니다. Regrettfully 개발자는 STRING_SPLIT ()의 결과 집합에 대한 인덱스를 포함하는 잊었지만이 일 것이고 설명되어 있습니다 :
OPENJSON FROM 통해 용액 () :
DECLARE @str VARCHAR(100) = 'val1,val2,val3'; SELECT * FROM OPENJSON('["' + REPLACE(@str,',','","') + '"]');
결과
key value type 0 val1 1 1 val2 1 2 val3 1
문서는 명확하게 알려줍니다 :
-
==============================
4.이 답변, 존 카펠 레티의 접근 방식을 확인하려면 그냥 테스트 코드가 아닙니다.
이 답변, 존 카펠 레티의 접근 방식을 확인하려면 그냥 테스트 코드가 아닙니다.
DECLARE @tbl TABLE(ID INT IDENTITY,SomeGuid UNIQUEIDENTIFIER); --Create more than 6 mio rows with an running number and a changing Guid WITH tally AS (SELECT ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) AS Nmbr FROM master..spt_values v1 CROSS JOIN master..spt_values v2) INSERT INTO @tbl SELECT NEWID() from tally; SELECT COUNT(*) FROM @tbl; --6.325.225 on my machine --Create an XML with nothing more than a list of GUIDs in the order of the table's ID DECLARE @xml XML= (SELECT SomeGuid FRom @tbl ORDER BY ID FOR XML PATH(''),ROOT('root'),TYPE); --Create one invalid entry UPDATE @tbl SET SomeGuid = NEWID() WHERE ID=10000; --Read all GUIDs out of the XML and number them DECLARE @tbl2 TABLE(Position INT,TheGuid UNIQUEIDENTIFIER); INSERT INTO @tbl2(Position,TheGuid) SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) ,g.value(N'text()[1]',N'uniqueidentifier') FROM @xml.nodes(N'/root/SomeGuid') AS A(g); --then JOIN them via "Position" and check, --if there are rows, where not the same values get into the same row. SELECT * FROM @tbl t INNER JOIN @tbl2 t2 ON t2.Position=t.ID WHERE t.SomeGuid<>t2.TheGuid;
이 간단한 경우 적어도 나는 항상 무효화 정확히 단지 하나 개의 기록 등을 얻을 ...
-
==============================
5.좋아, 일부 다시 사고 후 나는 ultimative XML 기반의 형태 보증 된 일종의 안전 스플리터을 제공합니다 :
좋아, 일부 다시 사고 후 나는 ultimative XML 기반의 형태 보증 된 일종의 안전 스플리터을 제공합니다 :
Declare @List varchar(max)='212345, 312345, 145687, 658975, 256987, 365874, 568974, 124578, 125689'; DECLARE @delimiter VARCHAR(10)=', '; WITH Casted AS ( SELECT (LEN(@List)-LEN(REPLACE(@List,@delimiter,'')))/LEN(REPLACE(@delimiter,' ','.')) + 1 AS ElementCount ,CAST('<x>' + REPLACE((SELECT @List AS [*] FOR XML PATH('')),@delimiter,'</x><x>')+'</x>' AS XML) AS ListXml ) ,Tally(Nmbr) As ( SELECT TOP((SELECT ElementCount FROM Casted)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values v1 CROSS JOIN master..spt_values v2 ) SELECT Tally.Nmbr AS Position ,(SELECT ListXml.value('(/x[sql:column("Tally.Nmbr")])[1]','int') FROM Casted) AS Item FROM Tally;
트릭은 (다수의 테이블이 더 나은했다)와 위치에 따라 요소를 선택하는 요소의 피팅 번호 숫자를 실행의 목록을 만드는 것입니다.
힌트 :이 오히려 느린 ...
WITH Casted AS ( SELECT (LEN(@List)-LEN(REPLACE(@List,@delimiter,'')))/LEN(REPLACE(@delimiter,' ','.')) + 1 AS ElementCount ,CAST('<x>' + REPLACE((SELECT @List AS [*] FOR XML PATH('')),@delimiter,'</x><x>')+'</x>' AS XML) .query(' for $x in /x return <x p="{count(/x[. << $x])}">{$x/text()[1]}</x> ') AS ListXml ) SELECT x.value('@p','int') AS Position ,x.value('text()[1]','int') AS Item FROM Casted CROSS APPLY Casted.ListXml.nodes('/x') AS A(x);
요소는 다음과 같이 생성된다
<x p="99">TheValue</x>
Regrettfully XQuery에 기능 위치 () 값을 검색 할 수 없습니다. 하지만 당신은 주어진 노드 전에 모든 요소를 계산하는 트릭을 사용할 수 있습니다. 이 카운트가 이상에 걸쳐 수행되어야로이 심하게 확장된다. 더 많은 요소 악화가 간다 ...
XQuery 사용은 말 그대로 주어진 목록을 반복합니다 :
WITH Casted AS ( SELECT (LEN(@List)-LEN(REPLACE(@List,@delimiter,'')))/LEN(REPLACE(@delimiter,' ','.')) + 1 AS ElementCount ,CAST('<x>' + REPLACE((SELECT @List AS [*] FOR XML PATH('')),@delimiter,'</x><x>')+'</x>' AS XML) .query(' for $i in (1,2,3,4,5,6,7,8,9) return <x p="{$i}">{/x[$i]/text()[1]}</x> ') AS ListXml ) SELECT x.value('@p','int') AS Position ,x.value('text()[1]','int') AS Item FROM Casted CROSS APPLY Casted.ListXml.nodes('/x') AS A(x);
from https://stackoverflow.com/questions/51030750/how-to-sort-in-order-as-entered-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 함수에서 쿼리를 반환? (0) | 2020.06.17 |
---|---|
[SQL] 링크 된 MySQL 서버 SELECT * FROM (0) | 2020.06.17 |
[SQL] 외래 키 제약 조건과 충돌 테이블 변경 문 (0) | 2020.06.17 |
[SQL] 어떻게 널 값에 대한 이전 값을 얻을 수 있습니다 (0) | 2020.06.17 |
[SQL] 열고 주변의 가까운 브래킷 MS 액세스 SQL에서 조인 할 때 (0) | 2020.06.17 |