【问题标题】:Translate table values to text following a fixed pattern按照固定模式将表格值转换为文本
【发布时间】:2020-03-24 07:17:41
【问题描述】:

我们使用软件来存储金融元素的组合。这些元素在某些组合中是允许的。这些组合的例外是前端中的类 SQL 语句,并在数据库表中保存为数值,如下例所示:

+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| 1    | 2    | 4    | 5    | 1    |
+------+------+------+------+------+
| -1   | 2    | 6    | 4    | 5    |
+------+------+------+------+------+
| 1    | 2    | 5    | 7    | 1    |
+------+------+------+------+------+

我想将这些数值转换回 SQL 语句,如下例所示:

+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| Col1 | Col1Trans | Col2 | Col2Trans | Col3 | Col3Trans | Col4 | Col4Trans | Col5 | Col5Trans |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| 1    | (         | 2    | SELECT    | 4    | CODE      | 5    | LIKE      | 1    | *         |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| -1   |           | 2    | SELECT    | 6    | NUMBER    | 4    | =         | 5    | AND       |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| 1    | (         | 2    | SELECT    | 5    | TOOL      | 7    | <>        | 1    | *         |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+

每列中的数值都不同,所以我只能想象使用很多案例......当我怀疑我怀疑的语句是否有效时。我不想创建表来保存翻译值。有没有办法用数组做到这一点?

是否有任何代码示例可以轻松地循环遍历表/列并翻译其中的内容?

【问题讨论】:

  • “我不想创建表格来保存翻译值”为什么?
  • 如果您没有一个表来存储“已翻译”的值,那么您将如何使它们可用于您正在编写的任何代码?通过对它们进行硬编码?有什么好处?然后:似乎翻译不仅取决于值,还取决于值出现的列。还是你的例子错了? 1 在一个地方是一个左括号,但在另一个地方是一个星号。这是故意的,还是错误的?
  • @Serg,我不喜欢在数据库中创建表,因为数据库是为这个程序准备的。只有在这种情况下,使用 select-statements 才会感觉更好。
  • @mathguy,这是故意的。每列都有自己的值和翻译,因为这是由使用数据库的程序设计的。如果由我决定,我会这样做。

标签: sql oracle translate


【解决方案1】:

您可以使用下面的代码并根据需要添加更多的case语句。

SELECT Col1
    ,CASE 
        WHEN Col1 = 1 THEN '('
        ELSE '' END AS Col1Trans
    ,Col2
    ,CASE 
        WHEN Col2 = 2 THEN 'SELECT'
        END AS Col2Trans
    ,Col3
    ,CASE 
        WHEN Col3 = 4 THEN 'CODE'
        WHEN Col3 = 6 THEN 'NUMBER'
        WHEN Col3 = 5 THEN 'TOOL'
        END AS Col3Trans
    ,Col4
    ,CASE 
        WHEN Col4 = 5 THEN 'LIKE'
        WHEN Col4 = 4 THEN '='
        WHEN Col4 = 7 THEN '<>'
        END AS Col4Trans
    ,Col5
    ,CASE 
        WHEN Col5 = 1 THEN '*'
        WHEN Col5 = 5 THEN 'AND'
        END AS Col5Trans

【讨论】:

    【解决方案2】:

    避免这么多case whendecode等的最好方法是使用with as子句,如下所示:

    With col1trans (value, translation) as 
    (Select 1, '(' from dual union all
    Select -1, null from dual),
    Col2trans (value, translation) as 
    (Select 2, 'SELECT' from dual)
    ..
    ... till col5trans
    Select m.col1, t1.translation as col1trans,
    .... till m.col5, t5.translation
    From your_table m join col1trans t1 m.col1=t1.value
    join col2trans t2 m.col2=t2.value 
    ... till col5trans
    

    干杯!!

    【讨论】:

    • @Tesjah,这是否比使用这么多 case when 语句更好?或者有什么好处?我不熟悉 with 语句,这就像在内存中而不是在 db 中创建一个表吗?
    • 它不创建任何表。它只是内联子查询(CTE)。但我认为对你来说,拥有它会很好,因为你可以避免很多情况,而预言机不需要做这么多次决策。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2020-03-19
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2019-04-07
    • 2019-05-08
    • 2021-10-03
    相关资源
    最近更新 更多