sql >> Databasteknik >  >> RDS >> Mysql

Hur räknar man alla NULL-värden i en tabell?

Om du vill att detta ska göras exklusivt av MYSQL och utan att räkna upp alla kolumner, ta en titt på den här lösningen.

I den här metoden behöver du inte underhålla antalet databaskolumner genom att hårdkoda dem. Om ditt tabellschema kommer att ändras kommer den här metoden att fungera och kommer inte att kräva kodändring.

SET @db = 'testing'; -- database
SET @tb = 'fuzzysearch'; -- table
SET @x = ''; -- will hold the column names with ASCII method applied to retrieve the number of the first char
SET @numcolumns = 0; -- will hold the number of columns in the table

-- figure out how many columns we have
SELECT count(*) into @numcolumns FROM information_schema.columns where [email protected] and [email protected];

-- we have to prepare some query from all columns of the table
SELECT group_concat(CONCAT('ASCII(',column_name,')') SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];
-- after this query we have a variable separated with comma like
-- ASCII(col1),ASCII(col2),ASCII(col3)

-- we now generate a query to concat the columns using comma as separator (null values are omitted from concat)
-- then figgure out how many times the comma is in that substring (this is done by using length(value)-length(replace(value,',',''))
-- the number returned is how many non null columns we have in that column
-- then we deduct the number from the known number of columns, calculated previously
-- the +1 is added because there is no comma for single value
SET @s = CONCAT('SELECT @numcolumns - (length(CONCAT_WS(\',\',', @x, '))-length(replace(CONCAT_WS(\',\',', @x, '),\',\',\'\')) + 1) FROM ',@db,'.',@tb,';');
PREPARE stmt FROM @s;
EXECUTE stmt;
-- after this execution we have returned for each row the number of null columns
-- I will leave to you to add a sum() group call if you want to find the null values for the whole table
DEALLOCATE PREPARE stmt;

ASCII används för att undvika att läsa, sammanfoga mycket långa kolumner för ingenting, även ASCII gör oss säkra för värden där det första tecknet är ett kommatecken(,).

Eftersom du arbetar med rapporter kan du ha nytta av detta eftersom det kan återanvändas för varje tabell om du lägger in en metod.

Jag försökte ge så många kommentarer som möjligt.

Låt oss dela i bitar på ovanstående kompakta sätt (omvänt sätt):

Jag ville få en sådan här fråga

SELECT totalcolumns - notnullcolumns from table; -- to return null columns for each row

Medan den första är lätt att beräkna genom att köra:

SELECT count(*) FROM information_schema.columns where [email protected] and [email protected];

Den andra inte-nullkolumnerna är lite smärtsam. Efter en bit av undersökning av funktionerna som är tillgängliga i MySQL, upptäcker vi att CONCAT_WS inte CONCAT null-värden

Så kör en fråga som denna:

SELECT CONCAT_WS(",","First name",NULL,"Last Name");
returns: 'First name,Last Name'

Detta är bra, vi tar bort nollvärdena från uppräkningen. Men hur får vi fram hur många kolumner som faktiskt var sammanlänkade?

Tja det är knepigt. Vi måste beräkna antalet kommatecken+1 för att få de faktiskt sammanlänkade kolumnerna.

För detta trick använde vi följande SQL-notation

select length(value)-length(replace(value,',','')) +1 from table

Ok, så vi har nu antalet sammanlänkade kolumner.

Men den svårare delen kommer härnäst.

Vi måste räkna upp alla värden för CONCAT_WS().
Vi måste ha något sånt här:

SELECT CONCAT_WS(",",col1,col2,col3,col4,col5);

Det är här vi måste använda de förberedda satserna, eftersom vi måste förbereda en SQL-fråga dynamiskt från ännu okända kolumner. Vi vet inte hur många kolumner som kommer att finnas i vår tabell.

Så för detta använder vi data från informationsschema kolumnertabellen. Vi måste skicka tabellnamnet, men även databasnamnet, eftersom vi kan ha samma tabellnamn i separata databaser.

Vi behöver en fråga som returnerar col1,col2,col3,col4,col5 till oss på CONCAT_WS "strängen"

Så för detta kör vi en fråga

SELECT group_concat(column_name SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];

En sak till att nämna. När vi använde metoden length() och replace() för att ta reda på hur många kolumner som var sammanlänkade, måste vi se till att vi inte har kommatecken bland värdena. Men notera också att vi kan ha riktigt långa värden i våra databasceller. För båda dessa trick använder vi metoden ASCII('värde'), som returnerar ASCII-tecknet för det första tecknet, vilket inte kan vara kommatecken och returnerar null för nollkolumner.

Med detta sagt kan vi komprimera allt detta i ovanstående omfattande lösning.



  1. Var finns PostgreSQL-loggarna på macOS?

  2. Gör sql view redigerbar

  3. Problem med PHP och Mysql UTF-8 (Special Character)

  4. Hur ansluter jag sql-server med php med xampp?