Sql 按照固定模式将表值转换为文本

Sql 按照固定模式将表值转换为文本,sql,oracle,translate,Sql,Oracle,Translate,我们使用软件来存储金融要素的组合。这些元素在某些组合中是允许的。这些组合的例外情况是前端中类似SQL的语句,并在数据库表中保存为数值,如以下示例所示: +------+------+------+------+------+ | Col1 | Col2 | Col3 | Col4 | Col5 | +------+------+------+------+------+ | 1 | 2 | 4 | 5 | 1 | +------+------+------+----

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

+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| 1    | 2    | 4    | 5    | 1    |
+------+------+------+------+------+
| -1   | 2    | 6    | 4    | 5    |
+------+------+------+------+------+
| 1    | 2    | 5    | 7    | 1    |
+------+------+------+------+------+
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| 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    | *         |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
我想将这些数值转换回SQL语句,如以下示例所示:

+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| 1    | 2    | 4    | 5    | 1    |
+------+------+------+------+------+
| -1   | 2    | 6    | 4    | 5    |
+------+------+------+------+------+
| 1    | 2    | 5    | 7    | 1    |
+------+------+------+------+------+
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
| 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    | *         |
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
|Col1 | Col1Trans | Col2 | Col2Trans | Col3 | Col3Trans | Col4 | Col4Trans | Col5 | Col5Trans|
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
|1 |(| 2 |选择| 4 |编码| 5 |像| 1 |*|
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
|-1 | 2 |选择| 6 |数字| 4 |=5 |和|
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+
|1 |(| 2 |选择| 5 |工具| 7 | 1 |*|
+------+-----------+------+-----------+------+-----------+------+-----------+------+-----------+

每列中的数值不同,因此我只能想象大量case…when语句的使用情况,我怀疑这些语句是否有效。我不想创建表来保存转换值。有没有办法使用数组来实现这一点


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

避免在和解码等时出现如此多的
情况的最佳方法是使用
和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

干杯!!

您可以使用下面的代码,并根据需要添加更多的案例说明

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
选择Col1
案例
当Col1=1时,则“(”
ELSE“”以Col1Trans结尾
,Col2
案例
当Col2=2时,则“选择”
以Col2Trans结束
,Col3
案例
当Col3=4时,则为“代码”
当Col3=6时,则为“数字”
当Col3=5时,则为“工具”
以Col3Trans结束
,Col4
案例
当Col4=5时,则“喜欢”
当Col4=4时,则“=”
当Col4=7时,则为“”
以Col4Trans结尾
,Col5
案例
当Col5=1时,则为'*'
当Col5=5时,则“AND”
以Col5Trans结束

“我不想创建表格来保存翻译值”为什么?如果没有表格来存储“翻译”值,否则您将如何使它们可用于您正在编写的任何代码?通过硬编码它们?有什么好处?然后:翻译似乎不仅取决于值,还取决于值出现的列。或者您的示例错误吗?1是一个左括号,但在另一个位置是星号她。这是故意的,还是一个错误?@Serg,我不喜欢在db中创建表,因为db是用于此程序的。只有在这种情况下使用select语句才会感觉更好。@mathguy,这是故意的。每一列都有自己的值和翻译,因为这是使用db的程序设计的。如果由我决定,我会这样做。@Tesjah、 这比使用这么多case-when语句的性能好吗?或者有什么好处?我不熟悉with语句,这就像在内存中而不是在数据库中创建一个表吗?它不创建任何表。它只是内联子查询(CTE).但我认为,对您来说,拥有它将是一件好事,因为您可以避免许多情况,而oracle不必多次做决策。