2012-09-28 54 views
0

我正在处理一个包含两个存储信息版本的表。为了简化它,一列包含文件运行的旧描述,而另一列包含显示运行文件的更新标准。它变得更加复杂,旧列可以有多个标准。表:SQL - 有条件地将同一个表中的两列合并为一个

Old Column    New Column 
Desc: LGX/101/rpt   null 
    null      Home 
Print: LGX/234/rpt   null 
    null      Print 
    null      Page 

我需要将两列合并成一个,但我也需要删除“打印”和“说明:”字符串从旧的列值的开始。有什么建议么?让我知道如果/当我忘记你需要知道的东西时!

(我写在缓存SQL,但我就像一个普通的方法我的问题,我可以找出过去的细节。)

编辑:条件是,如果SUBSTR(oldcol,如果substr(oldcol,1,6)='print:'then substr(oldcol,7)等等。为了取出“desc:'substr(oldcol,6) “和”print:“来对数据进行一定程度的消毒。

EDIT2:我想使表看起来像这样:

Col 
    LGX/101/rpt 
    Home 
    LGX/234/rpt 
    Print 
    Page 
+1

在您的标题中,您会说'有条件地'。什么情况?另外,你想如何结合他们?级联? –

+0

是否其中一列总是无效,或者是你的例子中发生了什么? –

回答

2

这很难理解你所期待的完全一样。上述内容代表需要组合/合并的之前还是之后?

我的猜测是COALESCE也许能够帮到你。它需要一堆参数并返回第一个非NULL。

+0

我正在显示表格现在的样子。对不起,我将包括我想要它看起来像 – eatonphil

+1

谢谢。然后我站在'COALESCE'列进行合并。你想要 'SELECT COALESCE(NewCol,OldCol)AS Col'来正确地合并列。 你已经解决了单词的剥离问题。但是,如果您没有多个单词去除,您也可以多次使用REPLACE: 'SELECT COALESCE(NewCol,REPLACE(REPLACE(OldCol,“Print:”,“”),“Desc:”, “))作为Col' –

1

它看起来像你想抓取新的值,如果旧为NULL,如果新值为空则旧。为此,您可以在SQL中使用case语句。我知道MySQL支持CASE语句,我不确定他们是否会在这里帮助你。

SELECT (CASE WHEN old_col IS NULL THEN new_col ELSE old_col END) as val FROM table_name

这会抢new_col如果old_col为NULL,否则会抢old_col。

+0

至于Desc:和Print:的删除,你可能会更好地使用任何语言来接收结果集。 SQL不是字符串操作的最佳选择。 – mdd061000

+0

斯蒂芬是对的,联盟将做与案例声明相同的事情,但它看起来更清晰。我会去那。 – mdd061000

0

您可以使用CharIndex和Substring函数的组合删除Print:和Desc:。这里去吧

SELECT CASE WHEN CHARINDEX(':',COALESCE(OldCol,NewCol)) > 0 THEN 
     SUBSTRING(COALESCE(OldCol,NewCol),CHARINDEX(':',COALESCE(OldCol,NewCol))+1,8000) 
     ELSE 
     COALESCE(OldCol,NewCol) 
     END AS Newcolvalue 
FROM [SchemaName].[TableName] 

Charindex给出了您正在搜索的字符/字符串的位置。

因此,您在计算列(合并部分)中获取“:”的位置并将该值传递给子字符串函数。然后在表示子字符串函数的位置添加+1以获取“:”后面的部分。现在你有一个没有“Desc:”和“Print:”的字符串。

希望这会有所帮助。

+0

MSSQL是我已经考虑到的数据库。 – Prakash