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