【问题标题】:How to do value validation in PostgreSQL (convert my SQL Server syntax to PostgreSQL)如何在 PostgreSQL 中进行值验证(将我的 SQL Server 语法转换为 PostgreSQL)
【发布时间】:2022-07-02 09:19:50
【问题描述】:

我正在使用 R 将数据库从 SQL Server 迁移到 PostgreSQL, 我已经搜索并尝试了几种方法来做到这一点,但仍然失败。 我希望有人可以为 PostgreSQL 提供类似的语法解决方案。 以下是我用于 SQL Server 的语法,我想将其更改为 PostgreSQL 语言

  UserValidation <- dbGetQuery(con,paste0("DECLARE @container AS INT = 0
                                                DECLARE @user AS INT
                                              IF EXISTS(SELECT 1 ID FROM dbo.user_information WITH(NOLOCK)
                                                        WHERE userID = '",Username,"')
                                                BEGIN
                                                     SET @user =(SELECT ID FROM dbo.user_information
                                                                 WHERE userID = '",Username,"' AND userpass= '",password,"')
                                                IF(@user IS NULL)
                                                     SET @container = 0
                                                ELSE
                                                     SET @container = 1
                                                END
                                                ELSE
                                                     SET @container = 2
                                              SELECT @container;"))

【问题讨论】:

  • 1) 不要标记要从中迁移的 RDBMS... 2) 在发布问题之前,您需要进行研究并试一试。

标签: sql r postgresql


【解决方案1】:

我不确定我是否理解 T-SQL 代码,但我的理解是如果用户存在,但密码不匹配,它会返回 0。如果用户存在且密码匹配则返回1,如果用户根本不存在则返回2。

如果上述假设是正确的,您可以在没有任何 IF 的情况下在单个查询中执行此操作(顺便说一句:上述规则是您应该在问题中描述该查询正在执行的操作)

select case
         when max(user_pass) = '****' then 1 -- user_id and password matches
         when max(user_pass) is null then 2 -- user_id does not match
         else 0 -- user_id matches, but password is different
       end as container 
from user_information
where user_id = 'arthur'

这假定user_id 在表user_information 中是唯一的,并使用max() 将始终返回至少一行的事实。然后使用 CASE 表达式来检测不同的条件。

您需要将'****' 替换为实际密码,将'arthur' 替换为实际用户ID。我希望您不要以纯文本形式存储密码,并且 password 值是真实密码的哈希版本!

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2016-01-22
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多