繁体   English   中英

PostgreSQL-在case语句中为字符串分配整数值

[英]PostgreSQL - Assign integer value to string in case statement

我需要根据我拥有的数据中的ID选择仅一行的数据。 我以为我已经解决了这个问题(有关详细信息,请参阅我的原始问题和解决方案,在这里: PostgreSQL-每个ID仅选择1行

但是,在某些情况下,我现在仍然获得多个值。 如果只有“ N / A”和其他1个值,那么就没问题..但是,如果我有多个值,例如: “ N / A”“ value1”“ value2” ,那么我的case语句是不够的然后我同时收到了“ value1”“ value2”的信息 这是有问题的案例陈述:

CASE
    WHEN "PQ"."Value" = 'N/A' THEN 1
    ELSE 0
END

我需要给每个字符串值一个唯一的整数值,然后问题将得到解决。 问题是:我该怎么做? 我的第一个想法是以某种方式将字符值转换为ASCII并将其求和..但我不确定如何做到这一点,并且还担心性能。 有没有一种方法可以非常简单地为每个字符串分配一个值,以便我只能选择1个值? 我不在乎实际上是哪一个...仅是1。

编辑

我现在正在尝试创建一个将每个字符的ASCII值相加的函数,以便可以从本质上将case语句更改为以下形式:

CASE
    WHEN "PQ"."Value" = 'N/A' THEN 9999999
    ELSE SumASCII("PQ"."Value")
END

但是,它有一个小问题。我将它添加为单独的问题,在这里: PostgreSQL-错误:查询没有结果数据的目的地

编辑2

感谢@Bohemian,我现在有了一个可行的解决方案,如下所示:

CASE
    WHEN "PQ"."Value" = 'N/A' THEN -1
    ELSE ('x'||LPAD(MD5("PQ"."Value"),16,'0'))::bit(64)::bigint
END DESC

这将为每个值产生一个“唯一”数字:

('x'||substr(md5("PQ"."Value"),1,8))::bit(64)::bigint

严格来说,有发生碰撞的可能性,但是距离很远。

如果结果“太大”,则可以尝试模数:

<above-calculation> % 10000

尽管发生碰撞的可能性为0.01%,但您应针对所有已知值尝试使用此公式,以确保不发生碰撞。

如果您不在乎选择哪个值,请将RANK()更改为ROW_NUMBER()。 如果您确实在乎,则无论如何都要这样做,但还要在ORDER BY中的CASE语句之后添加一个用逗号分隔的术语,并用所需的逻辑表示。例如,如果要按字母顺序排列第一个值,请执行以下操作:

...
ORDER BY CASE...END, "PQ"."Value")
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM