PostgreSQL CASE运算符的复杂情况

问题描述

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

profilePrivacyPermissions obj是用户obj的一部分,其外观如下:

    "profilePrivacyPermissions": [
      {
        "screenType": 1,"isEverybody": true,"isContacts": false,"isNobody": false
      },{
        "screenType": 2,"isEverybody": false,"isNobody": true
      },{
        "screenType": 4,{
        "screenType": 5,{
        "screenType": 3,"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_NOTES_FOLDERS(其screenType为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
        `;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...