Home > front end >  How to filter out a table using SQL query?
How to filter out a table using SQL query?

Time:10-05

I am new to SQL and having a hard time to filter out a table using SQL query. I have a table as below


CATEGORY     |      NAME         |     UID         |  LOCATION
------------------------------------------------------------------------
Planning     |      Test007      | AVnNDZEGp5JaMD  |  USER
Planning     |      Test007      | AVjNDZEGp5JaMD  |  SITE
Planning     |      Test007      | NULL            |  NULL
Develop      |      Test008      | AZkNDZEGp5JaMD  |  USER
Develop      |      Test008      | NULL            |  NULL
Workspace    |      Test10       | QWrNjwaEp5JaMD  |  USER
Workspace    |      Test10       | NULL            |  NULL
Workspace    |      Test10       | NULL            |  SITE

I want to filter out this table on one condition. For each unique "NAME" in table I want to exclude the row with "LOCATION" = NULL if there exists a row with "LOCATION" = SITE.

For example the one with "NAME" as "Test007" have 3 entries with "LOCATION" as "USER, SITE, NULL". So I want to check if there exist a entry with "SITE", If yes then exclude the "NULL" from output result.

This is the result I expect -


CATEGORY     |      NAME         |     UID         |  LOCATION
------------------------------------------------------------------------
Planning     |      Test007      | AVnNDZEGp5JaMD  |  USER
Planning     |      Test007      | AVjNDZEGp5JaMD  |  SITE
Develop      |      Test008      | AZkNDZEGp5JaMD  |  USER
Develop      |      Test008      | NULL            |  NULL
Workspace    |      Test10       | QWrNjwaEp5JaMD  |  USER
Workspace    |      Test10       | NULL            |  SITE

Entries of "Test007" & "Test10" with location as NULL are excluded.

CodePudding user response:

Here is one approach using window functions:

WITH cte AS (
    SELECT *, SUM(LOCATION = 'SITE') OVER (PARTITION BY NAME) cnt
    FROM yourTable
)

SELECT CATEGORY, NAME, UID, LOCATION
FROM cte
WHERE cnt = 0 OR LOCATION IS NOT NULL;

CodePudding user response:

Use NOT EXISTS:

SELECT t1.*
FROM tablename t1
WHERE t1.LOCATION IS NOT NULL
   OR NOT EXISTS (
     SELECT *
     FROM tablename t2
     WHERE t2.NAME = t1.NAME AND t2.LOCATION = 'SITE'
   ); 

See the demo.

  • Related