![](/img/trans.png)
[英]How to use case statement in Mode SQL with an Integer column and assign string value
[英]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.