coalesce()
Use का इस्तेमाल करें और एक सबक्वेरी
select id, o1,
CASE WHEN o2!=o1 THEN o2 END o2,
CASE WHEN o3!=o2 THEN o3 END o3
FROM
( select id, coalesce(org1,org2,org3) o1,
coalesce(org2,org3) o2,
org3 o3 from tbl ) t
अपडेट करें
पिछला उत्तर पर्याप्त नहीं था, क्योंकि R2D2 ने बिल्कुल सही पाया। दुर्भाग्य से आप MySQL में CTE नहीं कर सकते हैं इसलिए मैंने इसके बजाय एक दृश्य बनाया (मैंने उदाहरण को दूसरे कॉलम org4
द्वारा बढ़ाया है। ):
CREATE VIEW vert AS
select id i,1 n, org1 org FROM tbl where org1>'' UNION ALL
select id,2, org2 FROM tbl where org2>'' UNION ALL
select id,3, org3 FROM tbl where org3>'' UNION ALL
select id,4, org4 FROM tbl where org4>'';
इस दृष्टि से अब निम्न कार्य करना संभव है:
SELECT id,
(select org from vert where i=id order by n limit 1) org1,
(select org from vert where i=id order by n limit 1,1) org2,
(select org from vert where i=id order by n limit 2,1) org3,
(select org from vert where i=id order by n limit 3,1) org4
FROM tbl
सुंदर नहीं है, लेकिन यह काम पूरा करता है, यहां देखें:SQLfiddle
इनपुट:
| id | org1 | org2 | org3 | org4 |
|----|--------|--------|---------|--------|
| 1 | HR | (null) | Staff | IT |
| 2 | (null) | IT | Dev | (null) |
| 3 | (null) | (null) | Finance | HR |
आउटपुट:
| id | org1 | org2 | org3 | org4 |
|----|---------|-------|--------|--------|
| 1 | HR | Staff | IT | (null) |
| 2 | IT | Dev | (null) | (null) |
| 3 | Finance | HR | (null) | (null) |