Mysql 谁能缩短这个查询?

Mysql 谁能缩短这个查询?,mysql,sql,Mysql,Sql,此查询为现有架构生成下一个数据文件名。 例如,id的最后一个数据文件名是test_schema_05.dbf 然后这个查询给出test_schema_06.dbf 我需要缩短这个查询 这可能吗 SELECT CONCAT (SUBSTR (MAX (SUBSTR (file_name, INSTR (file_name, '/', 1, LENGTH (file_name) - L

此查询为现有架构生成下一个数据文件名。 例如,id的最后一个数据文件名是test_schema_05.dbf 然后这个查询给出test_schema_06.dbf 我需要缩短这个查询

这可能吗

SELECT  CONCAT
    (SUBSTR
        (MAX
            (SUBSTR 
                (file_name,
                INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                )
            ),
            1,
            INSTR 
                (MAX 
                    (SUBSTR 
                        (file_name, 
                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                        )
                    ),
                    '_',
                    1,
                    (LENGTH 
                        (MAX 
                            (SUBSTR 
                                (file_name, 
                                INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                                )
                            )
                        ) - LENGTH
                            (REPLACE
                                (MAX
                                    (SUBSTR
                                        (file_name, 
                                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                                        )
                                    ),
                                    '_'
                                )
                            )
                    )
                )
        ),
        CONCAT
            ('0', 
            SUBSTR
                (MAX 
                    (SUBSTR 
                        (file_name, 
                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/' ))) + 1
                        )
                    ),
                    INSTR
                        (MAX 
                            (SUBSTR 
                                (file_name,
                                INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/' ))) + 1
                                )
                            ),
                            '_',
                            1,
                            (LENGTH
                                (MAX
                                    (SUBSTR
                                        (file_name,
                                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                                        )
                                    )
                                ) - LENGTH
                                    (REPLACE
                                        (MAX
                                            (SUBSTR
                                                (file_name,
                                                INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                                                )
                                            ),
                                            '_'
                                        )
                                    )
                            )
                        ) + 1,
                        INSTR 
                            (MAX 
                                (SUBSTR 
                                    (file_name,
                                    INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1
                                    )
                                ),
                                '.',
                                1
                            ) - INSTR
                                (MAX 
                                    (SUBSTR 
                                        (file_name, 
                                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/' ))) + 1
                                        )
                                    ),
                                    '_',
                                    1,
                                    (LENGTH
                                        (MAX
                                            (SUBSTR
                                                (file_name,
                                                INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/' ))) + 1
                                                )
                                            )
                                        ) - LENGTH
                                            (REPLACE
                                                (MAX
                                                    (SUBSTR
                                                        (file_name,
                                                        INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/' ))) + 1
                                                        )
                                                    ),
                                                    '_'
                                                )
                                            )
                                    )
                                ) - 1
                ) + 1
            )
    )

|| '.dbf'   AS  data_file_name
FROM    dba_data_files
WHERE   tablespace_name = 
    (SELECT     default_tablespace
    FROM        dba_users
    WHERE       username = 'schema_name'
    );

这几乎让我哭了。此外,您的查询似乎有点错误,因为MAX函数似乎只包含一个值,即字符串

你有那么多重复的行,这会阻塞你的查询,当你试图阅读它时,你的大脑也会被阻塞。将其提取为一个变量!假设这一切都在某个存储过程中,您将得到如下结果:

DECLARE i_intLocation   INTEGER;
SET i_intLocation = INSTR (file_name, '/', 1, LENGTH (file_name) - LENGTH (REPLACE (file_name, '/'))) + 1;

DECLARE i_strSubstr     VARCHAR;
SET i_strSubstr = (SUBSTR (file_name, i_intLocation));

SELECT  
CONCAT(
    SUBSTR(
        MAX(i_strSubstr),
        1,
        INSTR(
            MAX(i_strSubstr),
            '_',
            1,
            (
                LENGTH(MAX(i_strSubstr)) 
                - LENGTH(
                    REPLACE(
                        MAX(i_strSubstr),
                        '_'
                    )
                )
            )
        )
    ),
    CONCAT(
        '0', 
        SUBSTR(
            MAX(i_strSubstr),
            INSTR(
                MAX(i_strSubstr),
                '_',
                1,
                (
                    LENGTH(MAX(i_strSubstr))
                    - LENGTH(
                        REPLACE(
                            MAX(i_strSubstr),
                            '_'
                        )
                    )
                )
            ) + 1,
            INSTR(
                MAX(i_strSubstr),
                '.',
                1
            ) 
            - INSTR(
                MAX(i_strSubstr),
                '_',
                1,
                (
                    LENGTH(MAX(i_strSubstr))
                    - LENGTH(
                        REPLACE(
                            MAX(i_strSubstr),
                            '_'
                        )
                    )
                )
            ) - 1
        ) + 1
    )
)

|| '.dbf'   AS  data_file_name
FROM    dba_data_files
WHERE   tablespace_name = 
    (SELECT     default_tablespace
    FROM        dba_users
    WHERE       username = 'schema_name'
    );

使用子查询来获得最高的文件名以缩短代码,结果可能是这样的,但我怀疑这并没有更高的效率(很可能效率更低)

然而,这只是基于您的代码,其中有语法错误(我刚才在上面的代码中重复了这些错误)。例如,您的代码使用带有4个参数的INSTR(应该只有2个)。类似地,您使用的是仅替换2个参数。函数正在查找“/”,而作为示例提供的文件名不包含任何“/”字符


文件名的格式有多固定?只有一个。在文件名中?要增加的数字是否总是紧跟在.dbf之前?

您希望通过缩短来实现什么?可读性、性能、简化逻辑?您似乎多次使用相当复杂的子字符串计算(尽管我希望MySQL将其优化为只执行一次)。为了便于阅读,您可以在子查询中执行此操作。此问题似乎与主题无关,因为它属于上一个问题。我想缩短它的代码行,如上所述,此函数为特定架构提供了最高的数据文件名,并且此函数对我来说运行良好。我正在尝试是否可以将代码再缩短一点。您粘贴的代码无法运行,因为其中的函数具有错误的参数数。例如,它的一个片段是
MAX(SUBSTR(文件名,INSTR(文件名,'/'),1,LENGTH(文件名)-LENGTH(REPLACE(文件名,'/'))+1))
。INSTR在这里有4个参数(只需要2个),而SUBSTR只有2个。然而,为了有效地缩短代码,我需要知道更多的细节,确切地说,你想缩短什么,以及你是如何将它分解来缩短的。谢谢。如上所述,此函数为特定架构提供最高的数据文件名,此函数对我来说运行良好。我正在尝试是否可以将代码再缩短一点。@saurabhk好的,如果可以,那么它就可以运行。希望我做起酥油的时候没有搞砸。我相信有更好的方法可以做到这一点,但现在至少它更具可读性
SELECT    CONCAT(SUBSTR(sub1.derived_bit,1,INSTR(sub1.derived_bit,'_',1,(LENGTH(sub1.derived_bit)- LENGTH(REPLACE(sub1.derived_bit,'_'))))),
CONCAT('0',SUBSTR(sub1.derived_bit,INSTR(sub1.derived_bit,'_',1,(LENGTH(sub1.derived_bit)- LENGTH(REPLACE(sub1.derived_bit,'_'))))+ 1,INSTR
(sub1.derived_bit,'.',1)- INSTR(sub1.derived_bit,'_',1,(LENGTH(sub1.derived_bit)- LENGTH(REPLACE(sub1.derived_bit, '_' ))))- 1)+ 1), '.dbf') AS data_file_name
FROM 
(
    SELECT MAX(SUBSTR(file_name, INSTR(file_name, '/', 1, LENGTH(file_name) - LENGTH(REPLACE(file_name, '/'))) + 1)) as derived_bit
    FROM dba_data_files 
    INNER JOIN dba_users
    ON dba_data_files.tablespace_name = dba_users.default_tablespace AND username = 'schema_name'
) sub1