2017-10-20 101 views
0

我正在處理ID類型的邏輯,其中大約有20個,我在查詢中的where子句下執行IDType = COALESCE(1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19))合併SQL函數的參數限制?

1)對於類型1和12的記錄。當滿足1時,忽略12,我只看到一個結果(顯然前兩個)。

2)記錄類型ID爲6,8,11。我期望它會按照Coalesce中指定的順序選擇6並刪除8和11個類型,但這不起作用。有趣的是,我沒有找到這個記錄的任何結果。

Coalesce函數中的參數數量是有限制的,因爲在第一種情況下它正在拾取1而忽略12,第二種情況下它沒有拾取任何ID類型。請幫助#NewToSQL

+0

請標記你的rdbms(sql-server,oracle,postgres等) – Igor

+3

COALESCE的結果(1,2,4,5,6,7,8,9,10,11,12,13,15,16,17 ,18,19)始終爲1. coalesce返回第一個非空。 – KeithL

回答

2

如果你需要拿起「第一」 IDType你可以用窗函數的一個做到這一點,說ROW_NUMBER

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 

更新添加partition by employee_id(假設表有employee_id場)

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (PARTITION BY t.employee_id ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 
+0

這是做什麼是爲所有記錄編號的所有ID類型,但只選擇(顯然)行號1.因此,如果有10名僱員25 ID。對結果集進行編號1到25,並對行號1進行篩選並輸出1條記錄。我想要的是返回10個員工,但只有一個ID類型(假設他們都有1個ID類型,他們都返回結果集),對嗎? – Sanj

+0

@Sanj:更新。我想你應該提到問題中的所有要求,除非你寫下來,否則不可能猜出你需要什麼。 – a1ex07

+0

您的更新答案是我正在尋找的東西,非常棒的學習! – Sanj

1

在SQL Server COALESCE中沒有關於參數數量的明確限制。

你讀到你的問題聽起來像一個邏輯問題,你必須使用Case (Transact-SQL)解決。

COALESCE (Transact-SQL)是解決null問題。

+0

可能是你是對的,我使用了錯誤的功能。在我的情況下,當我想忽略剩餘的ID類型時,更好的方法是什麼?說第二種情況,其中6是可用的,我想忽略8和11類型。 – Sanj

+0

@Sanj你能否提供一張表格來顯示Id和預期結果?我無法找到你的輸入的一個很好的解決方案。 –