用于比较由数字和文本组成的字符串的 SQL

标签 sql postgresql sorting postgresql-9.2 natural-sort

我需要比较两个包含数字和可能文本的字符串。例如我有这张表:

id | label 1  |  label 2 | 
1  |  12/H    |     1    |
2  |   4/A    |    41/D  |
3  |  13/A    |     3/F  |
4  |   8/A    |     8/B  |
..

我需要确定方向,以便如果标签 1 < 标签 2 则方向为 W(同),否则为 A(反对)。所以我必须构建一个以这种方式呈现数据的 View :

id | Direction  
1  |     A    |   
2  |     W    |
3  |     A    |
4  |     W    |
..

我使用的是 postgres 9.2。

最佳答案

WITH x AS (
   SELECT id
         ,split_part(label1, '/', 1)::int AS l1_nr
         ,split_part(label1, '/', 2)      AS l1_txt
         ,split_part(label2, '/', 1)::int AS l2_nr
         ,split_part(label2, '/', 2)      AS l2_txt
   FROM t
   )
SELECT id
      ,CASE WHEN (l1_nr, l1_txt) < (l2_nr, l2_txt)
       THEN 'W' ELSE 'A' END AS direction
FROM   x;

我用 split_part() 分割了两部分并使用临时行类型检查哪个标签更大。

尚未定义两个标签相等或其中一个标签为 NULL 的情况。

CTE没有必要,只是为了更容易阅读。

-> sqlfiddle

关于用于比较由数字和文本组成的字符串的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14247611/

相关文章:

c# - 使用 LINQ 自定义排序

python - 找到具有最多值的键并打印其值(字典,python)

sql - 如何查找 SQL Server 2008 中的总表空间使用情况?

sql - 在第一次引导事件发生之前查找平均观看次数

c# - 通用数据库连接 C#

mysql - 如何在mysql中将这两个结果合并为一个?

sql - 了解With查询操作

java - Spring Data PostgreSQL Key already exists 错误2

sql - 如何在已使用sql预订的房间列表中获得空闲时间

c++ - Linux 上的 std::vector sort() ?