一个sql查询来检查唯一

时间:2018-04-07 04:12:38

标签: java sql postgresql spring-mvc

我有一个Spring Mvc应用程序,在注册表格中我有一个电子邮件区域和名称

在注册之前,检查所有字段在数据库中是否唯一,并在服务层中使用以下代码(我使用notifyDataSetChanged();

spring data

然后在控制器i中检查是否存在Optional。但是使用此代码我向数据库发出2个请求,我可以使用这样的本机查询来只生成一个请求:

@Override
    public Optional<String> isUnuque(final Users user) {
        if (this.repository.findByEmail(user.getEmail()) != null) {
            return Optional.of("Your email is not unique");
        } else if (this.repository.findByName(user.getName()) != null) {
            return Optional.of("Your name is not unique");
        }
        return Optional.empty();

    }

但我怎么知道哪个参数不是唯一名称或电子邮件?

提前感谢

BTW我用以下代码解决了这个问题

select * from users where name = 'dd' or email = 'ddd@mail.ru'

但是如果有任何sql查询可以完全按照我想要的方式执行而无需在服务层中进行双重检查,请在下面写下

2 个答案:

答案 0 :(得分:1)

我不是Java专家,但作为数据库人员,我想说更好的方法是在表格中对UNIQUEname强制实施email约束并处理异常,无论应用程序如何,它都能保持数据的完整性。

另一种选择是使用给定的参数获取电子邮件和名称的计数。

SELECT count(CASE 
            WHEN name = :p_name
                THEN 1
            END) AS name_count
    ,count(CASE 
            WHEN email = :p_email
                THEN 1
            END) AS email_count
FROM users;

COUNT函数不计算空值,因此当CASE中的条件为假(默认为NULL)时,它会将0加到计数中。因此,有效的查询会将name_countemail_count返回为0或1,具体取决于您应该可以在代码中使用的现有值。

答案 1 :(得分:0)

Union All可以做到这一点。

select 'name' from users where name = 'dd'
union all
select 'email' from users where name = 'ddd'@mail.ru