我有一個5個欄位的表,我想做一個這樣的題:
我有一個5個欄位的表,我想做一個這樣的題:
SELECT *
FROM dbo.table
WHERE somefield in (90, 120, 30, 90)
問題是,我在表格的行中有幾個90、120和30的值,但我想只回傳前4行,即符合標準的行。
有什么簡單的方法可以做到這一點嗎?我使用的是SQL server 2008。
CREATE TABLE ForgeRock
([id] int, [somefield] int)
;
INSERT INTO ForgeRock
([id], [somefield])
VALUES[/span
(1, 90) 。
(2, 90) 。
(3, 120)。
(4, 30)。
(5, 30)。
(6, 90)。
(7, 10)。
(8, 20)。
(9, 90)。
(10, 30)。
(11, 20)
;
擺弄資料和查詢。
預期的結果將是90,120,20,90和他們所尊重的ids.
uj5u.com熱心網友回復:
你是通過串列過濾,而in只是檢查它的每個輸入值的成員。所以值在串列中的順序位置并不重要,它只用于過濾。為了區分同一個值的兩個不同的實體,你需要將這個串列變成表格,或者做一些其他的轉換來保存順序資訊。
一種方法可以是表值構造器:
with flt as (
select
價值。
row_number() over(partition by val order by val) as rn /*以區分值的實體*/
from(values(90)。 (120), (30), (90) as t(val)
)
, 基礎 as (
select select
f.*,
row_number() over(partition by somefield order by id) as rn
from ForgeRock as f
where somefield in (select flt.val from flt) /*限制行號前的輸入*/)
)
select b.*
from base as b.
join flt
/*匹配值和重復*/
on b.somefield = flt.val
and b.rn = flt.rn
id somefield rn4 30 1
1 90 90 1
2 2
3 120 120 1
對于現代版本,還有openjson的可能性,如果你從外部接收這個串列:
with flt as (
select select
[value] as val,
row_number() over(partition by [value] order by [key>) as rn /*為了區分值的實體*/。
from openjson('[90, 120, 30, 90]'/span>) as t
)
...
同樣的代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314792.html
標籤:
