需要一个SQL查询来对1个表中的数据进行字符串修剪并匹配到另一个表

时间:2016-03-18 03:52:27

标签: sql

好的,这就是我想要完成的事情。

表1中有一个名为inifile,path的列。参赛作品看起来像......

----------------------------------
|   inifile   |     path          | 
----------------------------------
|example1.ini | c:\temp\text.txt  |
|example2.ini | c:\temp\text2.txt |
----------------------------------

表2包含名为jobs和作业名称的列。参赛作品看起来像......

---------------------------- 
|  jobs    |   job name    |
----------------------------
| example1 | Example Job 1 |
| example2 | Example Job 2 |
----------------------------

表2中的作业数据与表1中的inifile相匹配,减去'.ini'扩展名。因此,我需要修剪“inifile”字段的扩展名,并将其与“jobs”字段一起加入,以返回“作业名称”和“路径”。 inifile中的字段长度不同。

所以返回带回来

------------------------------------------------------
|  jobs     |    job name         |   path           |
------------------------------------------------------
| example1  |  Example Job 1      | c:\temp\text.txt |
| example2  |  Example Job 2      | c:\temp\text2.txt|
------------------------------------------------------

我对此大肆渲染,并没有任何运气。

5 个答案:

答案 0 :(得分:0)

我认为这会为你做到:

Select T2.* 
  from T2
    inner join T1 on Replace(inifile, '.ini', '') = T2.jobs

答案 1 :(得分:0)

试试这个:

SELECT Table2.jobs, table2.JobName, table1.Path
FROM
  Table1
  JOIN Table2 ON table2.jobs = REPLACE(table1.inifile, '.ini','')

答案 2 :(得分:0)

试试这个

while (currentPtr!=NULL) {
        if()
        printf("%c", currentPtr->data);
        currentPtr=currentPtr->nextPtr;

    }

答案 3 :(得分:0)

如果您保证最多只出现一次' .ini'在字符串值中,并且它在字符串的末尾,那么REPLACE函数(在其他答案中演示)可以为你工作。

要在第一次出现' .ini'时修剪字符串,您可以使用SUBSTRING_INDEX函数

 SET @foo = 'foo.ini' ;
 SELECT SUBSTRING_INDEX(@foo,'.ini',1) ;

如果有多次出现' .ini'在字符串中,您的目标是删除' .ini'从字符串的末尾...

 SET @foo = 'foo.init.bar.ini'; 
 SELECT IF(@foo LIKE '%.ini',SUBSTRING(@foo,1,CHAR_LENGTH(@foo)-4),@foo) ;

无论哪个表达式都需要它来返回列中的值,您可以在谓词中使用该表达式。

SELECT ...
  FROM table1 t1
  JOIN table2 t2
    ON t2.jobs = IF(t1.inifile LIKE %.ini'
                   ,SUBSTRING(t1.inifile,1,CHAR_LENGTH(t1.initfile)-4)
                   ,t1.inifile
                 )

作为替代方案,您可以考虑将".ini"连接到table2中列的值,并进行比较

    ON CONCAT(t2.jobs,'.ini') = t1.inifile

答案 4 :(得分:0)

您没有指定RDBMS。假设您使用SQL Server 2012+,则可以使用PARSENAME

SELECT t2.job, t2.job_name, t1.path
FROM table1 t1
JOIN table2 t2
  ON PARSENAME(inifile,2) = t2.job;

LiveDemo

输出:

╔══════════╦═══════════════╦══════════════════╗
║   job    ║   job_name    ║       path       ║
╠══════════╬═══════════════╬══════════════════╣
║ example1 ║ Example Job 1 ║ c:\temp\text.txt ║
║ example2 ║ Example Job 2 ║ c:\temp\text2.tx ║
╚══════════╩═══════════════╩══════════════════╝