Sql 使用条件提取最后一列
我正在处理的数据集示例如下: 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: :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不断重复。我需要提取单元格的最新值。因此,在这种情况下,它应该
如果列名是动态的,则可以通过按顺序动态选择所需的列来使用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;