Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用条件提取最后一列_Sql_Oracle - Fatal编程技术网

Sql 使用条件提取最后一列

Sql 使用条件提取最后一列,sql,oracle,Sql,Oracle,我正在处理的数据集示例如下: ColA ColB ColC ColD ColE ColF ColG ColH ColI ColJ ColK ColL ColM X1 5 X2 6 X3 5 X4 4 X5 5 X6 3 X7 带有数字的列表示ID,其余的表示值等 我想从ID5后面的单元格中提取值。如果您查看示例,可以看到id 5不断重复。我需要提取单元格的最新值。因此,在这种情况下,它应该

我正在处理的数据集示例如下:

ColA ColB ColC ColD ColE ColF ColG ColH ColI ColJ ColK ColL ColM X1 5 X2 6 X3 5 X4 4 X5 5 X6 3 X7 带有数字的列表示ID,其余的表示值等

我想从ID5后面的单元格中提取值。如果您查看示例,可以看到id 5不断重复。我需要提取单元格的最新值。因此,在这种情况下,它应该是“X6”

你能帮我为这个问题写一个sql查询吗

谢谢,, Nimish

使用大小写表达式,并按相反顺序浏览各列:

Oracle 11g R2架构设置:

问题1:

:


如果列名是动态的,则可以通过按顺序动态选择所需的列来使用PL/SQL块。注意,这里我使用ROWNUM<2将行限制为1。如果表中有多行,则需要使用另一个循环

SET SERVEROUTPUT ON;

DECLARE
   v_col_value    VARCHAR2 (10) := NULL;
   v_prev_value   VARCHAR2 (10) := NULL;
BEGIN
   FOR cur IN (  SELECT COLUMN_NAME
                   FROM ALL_TAB_COLUMNS
                  WHERE TABLE_NAME = 'TST_TAB'
               ORDER BY COLUMN_NAME DESC)
   LOOP
      v_prev_value := v_col_value;

      EXECUTE IMMEDIATE
         'SELECT ' || cur.column_name || ' FROM TST_TAB WHERE ROWNUM < 2'
         INTO v_col_value;

      IF v_col_value = '5'
      THEN
         DBMS_OUTPUT.PUT_LINE (v_prev_value);

         EXIT;
      END IF;
   END LOOP;
END;

标记RDBMS MySQL、MS SQL Server等。。。您正在使用的。数据库中没有单元格。你真的在使用Excel吗?正如你自己所说,5是重复的。那么,为了确定以下所需值,您指的是哪5个?为了避免给人留下您正在谈论电子表格的印象,请显示数据库中相关表的实际模式。也许在表格create table中…@Yunnosch最新的valueCase表达式。@jarlh更新,谢谢-总是很高兴学究式地使用术语。尽管Oracle文档在和之间不一致,PL/SQL也有一个case语句。当我运行@MTO建议的查询时,我得到以下错误:ORA-00911:无效字符*原因:标识符不能以字母和数字以外的任何ASCII字符开头。$\u也允许在第一个字符后使用。双引号括起的标识符可以包含双引号以外的任何字符。可选引号q“…”不能使用空格、制表符或回车符作为分隔符。对于所有其他上下文,请参阅SQL语言参考手册*措施:@NimishVaddiparti使用您的表和示例数据的DDL和DML语句更新您的问题,或发布您自己的SQLFIDLE-从我的查询链接的SQLFIDLE显示它适用于我使用的示例数据,但我无法评论您使用的错误,因为我不知道如何复制它。
SELECT CASE
       WHEN ColL = '5' THEN ColM
       WHEN ColK = '5' THEN ColL
       WHEN ColJ = '5' THEN ColK
       WHEN ColI = '5' THEN ColJ
       WHEN ColH = '5' THEN ColI
       WHEN ColG = '5' THEN ColH
       WHEN ColF = '5' THEN ColG
       WHEN ColE = '5' THEN ColF
       WHEN ColD = '5' THEN ColE
       WHEN ColC = '5' THEN ColD
       WHEN ColB = '5' THEN ColC
       WHEN ColA = '5' THEN ColB
       END AS latest
FROM   table_name
| LATEST |
|--------|
|     X6 |
SET SERVEROUTPUT ON;

DECLARE
   v_col_value    VARCHAR2 (10) := NULL;
   v_prev_value   VARCHAR2 (10) := NULL;
BEGIN
   FOR cur IN (  SELECT COLUMN_NAME
                   FROM ALL_TAB_COLUMNS
                  WHERE TABLE_NAME = 'TST_TAB'
               ORDER BY COLUMN_NAME DESC)
   LOOP
      v_prev_value := v_col_value;

      EXECUTE IMMEDIATE
         'SELECT ' || cur.column_name || ' FROM TST_TAB WHERE ROWNUM < 2'
         INTO v_col_value;

      IF v_col_value = '5'
      THEN
         DBMS_OUTPUT.PUT_LINE (v_prev_value);

         EXIT;
      END IF;
   END LOOP;
END;