简体   繁体   中英

Count of empty values in string array in PostgreSQL

I want to check Projects column values have the same values for all the same values of PartNo and PartName columns. Projects column data type is character variyng[]. For example:

PartNo PartName Projects
1 3 6;5
1 3
1 3
3 2 5;5

In this case, Projects have different values (6;5) and () for the same PartName(3) and PartNo(1).

This is my query, but it does not work with empty character variyng[] in projects column!

          SELECT COUNT(*) from (
      select c.partno, c.partname
   FROM unnest(items) as c
   GROUP BY c.partno, c.partname
HAVING COUNT(distinct c.projects) > 1) as xxx
   INTO errCount;

   IF errCount > 0 THEN
      RETURN QUERY 
         SELECT 0 as status, format('Projects value should be the same for all Codes of the Part No %s and Name %s',c.partno,c.partname) as message  
         FROM unnest(items) as c
   GROUP BY c.partno, c.partname
HAVING COUNT(distinct c.projects) > 1 
         ;
      RETURN;
   END IF;

In the case of two different values in projects (not empty array), it works.

you can use a query like this with

coalesce

function to convert null in array[null]

WITH tt AS (
    SELECT
        partno,
        partname,
        COALESCE ( project, ARRAY [null] ) AS pro 
    FROM
        tab1 
    ) SELECT
    *,
    COUNT ( pro ) AS num 
FROM
    tt 
GROUP BY
    partno,
    partname,
    pro

to create test table:

CREATE TABLE "tab1" (
  "pk" serial4 primary key,
  "partno" int4,
  "partname" int4,
  "project" varchar[] 
);


INSERT INTO "tab1" (partno,partname,project) VALUES ( 1, 3, '{6,5}');
INSERT INTO "tab1" (partno,partname,project) VALUES ( 1, 3, NULL);
INSERT INTO "tab1" (partno,partname,project) VALUES ( 1, 3, NULL);
INSERT INTO "tab1" (partno,partname,project) VALUES ( 3, 2, '{5,5}');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM