sql >> Database teknologi >  >> RDS >> Mysql

Hvordan skifter man kolonneværdier i MySQL?

Brug coalesce() og en underforespørgsel

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
 

OPDATERING

Det tidligere svar var ikke tilstrækkeligt, som R2D2 ganske rigtigt fandt ud af. Desværre kan du ikke lave CTE'er i mysql, så jeg oprettede en visning i stedet (jeg udvidede eksemplet med en anden kolonne 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>'';
 

Med denne visning er det nu muligt at gøre følgende:

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
 

Ikke smukt, men det får jobbet gjort, se her:SQLfiddle

input:

| id | org1 | org2 | org3 | org4 | |----|--------|--------|---------|--------| | 1 | HR | (null) | Staff | IT | | 2 | (null) | IT | Dev | (null) | | 3 | (null) | (null) | Finance | HR |

output:

| id | org1 | org2 | org3 | org4 | |----|---------|-------|--------|--------| | 1 | HR | Staff | IT | (null) | | 2 | IT | Dev | (null) | (null) | | 3 | Finance | HR | (null) | (null) |

  1. Brug af FLASHBACK i Oracle

  2. Sender data fra React til MySQL

  3. Hvorfor får tilføjet RAND() MySQL til at overbelaste?

  4. Håndtering af databaseintegritet