Mysql 谁能缩短这个查询?
此查询为现有架构生成下一个数据文件名。 例如,id的最后一个数据文件名是test_schema_05.dbf 然后这个查询给出test_schema_06.dbf 我需要缩短这个查询 这可能吗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
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