PostgreSQL的复杂案例&x27;s案例操作员

PostgreSQL的复杂案例&x27;s案例操作员,postgresql,typeorm,Postgresql,Typeorm,我有一个搜索方法,用于在数据库中查找用户。用户可能会隐藏一些个人信息(负责此操作的设置称为profilePrivacyPermissions),例如电话号码、电子邮件。例如,如果用户的电子邮件是隐藏的,那么当通过电子邮件搜索时,该用户不应出现在搜索结果中 profilePrivacyPermissions对象是用户对象的一部分,如下所示: "profilePrivacyPermissions": [ { "screenType&q

我有一个搜索方法,用于在数据库中查找用户。用户可能会隐藏一些个人信息(负责此操作的设置称为
profilePrivacyPermissions
),例如电话号码、电子邮件。例如,如果用户的电子邮件是隐藏的,那么当通过电子邮件搜索时,该用户不应出现在搜索结果中

profilePrivacyPermissions对象是用户对象的一部分,如下所示:

    "profilePrivacyPermissions": [
      {
        "screenType": 1,
        "isEverybody": true,
        "isContacts": false,
        "isNobody": false
      },
      {
        "screenType": 2,
        "isEverybody": false,
        "isContacts": false,
        "isNobody": true
      },
      {
        "screenType": 4,
        "isEverybody": true,
        "isContacts": false,
        "isNobody": false
      },
      {
        "screenType": 5,
        "isEverybody": true,
        "isContacts": false,
        "isNobody": false
      },
      {
        "screenType": 3,
        "isEverybody": true,
        "isContacts": false,
        "isNobody": false
      }
    ]
此枚举定义了几种屏幕类型:

export enum EScreenType {
    PHONE_NUMBER = 1,
    EMAIL = 2,
    PHOTO = 3,
    TASKS_NOTES_FOLDERS = 4,
    AUTO_ACCEPT_INVITES = 5,
}
以下是我用于此搜索的查询请求:

        const users = await this.userRepository.createQueryBuilder('user')
                                               .where(whereClause, filters)
                                               .leftJoinAndSelect('user.subscription', 'subscription')
                                               .leftJoinAndSelect('user.profilePrivacyPermissions', 'perms')
                                               .limit(ESearchResponseEntityNumber.USERS)
                                               .getMany();
whereClause
如下所示:

        const whereClause = `
        (CASE perms.isEverybody WHEN true THEN
            CASE perms.screenType
               WHEN ${EScreenType.PHONE_NUMBER} THEN "user".phone ILIKE :searchTerm
               WHEN ${EScreenType.EMAIL}        THEN "user".profile_email ILIKE :searchTerm
            END
        END
         OR "user".username ILIKE :searchTerm
        ) AND "user".id != :userId
        `;
现在我需要根据以下逻辑修改此查询:

TASKS\u NOTES\u文件夹
(其屏幕类型为4)为
false时
用户不应出现在 搜索结果

以下是我的尝试(但无效):

        const whereClause = `
            (CASE
                WHEN perms.isEverybody = true THEN
                    CASE perms.screenType
                        WHEN ${EScreenType.PHONE_NUMBER} THEN "user".phone ILIKE :searchTerm
                        WHEN ${EScreenType.EMAIL}        THEN "user".profile_email ILIKE :searchTerm
                    END
                WHEN perms.isNobody = true AND perms.screenType = ${EScreenType.TASKS_NOTES_FOLDERS} THEN NULL
             END
             OR "user".username ILIKE :searchTerm
            ) AND "user".id != :userId
        `;