Oracle - 舍入所有列中的所有数值

Oracle - Round all the numeric values in all columns

这是我的第一个问题。

我第一次需要舍入 Oracle table 中包含的所有数值。

我从经典 "SELECT * FROM ... WHERE ..."(我有 147 列)开始,我想四舍五入我在行/列中找到的所有小数。

有办法吗?

谢谢!

您可以使用动态查询,如下所示:

BEGIN
    FOR ALL_COLS IN (
        SELECT TABLE_NAME,
               COLUMN_NAME
          FROM USER_TAB_COLUMNS
         WHERE TABLE_NAME = '<YOUR_TABLE_NAME>' AND DATA_TYPE = 'NUMBER'
    ) LOOP
        EXECUTE IMMEDIATE 'UPDATE ' || TABLE_NAME
                       || ' SET ' || COLUMN_NAME || ' = ROUND(' || COLUMN_NAME || ') '
                       || ' WHERE ' || COLUMN_NAME || ' <> ROUND(' || COLUMN_NAME || ')';
    END LOOP;
COMMIT;
END;
/

您可以像下面这样构建查询

    SELECT 'SELECT '
           || Listagg(Decode(data_type, 'NUMBER', 'ROUND('
                                                  ||column_name
                                                  ||') '
                                                  || column_name,
                                        column_name), ',')
                within GROUP (ORDER BY column_id)
           ||' FROM '
           ||'TABLE_NAME'
    FROM   user_tab_cols
    WHERE  table_name = 'TABLE_NAME' 

感谢您的所有回答...

最后,我为我的所有列创建了一个循环并重新编写了查询:用户插入一个 "SELECT " 然后我用所有列名替换“”(并且数字上的 ROUND)。

这不是 "fastest" 解决方案,但它有效...