使用Substring搜索SQL Server数据库

时间:2013-07-15 13:24:38

标签: tsql search substring

我有一个查询只提取两列,并将其中一列修剪为仅媒体名称。这是对此的查询:

   Select
   [Object],  
   CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA]
   from JnlDataSection

这样的结果是:

Object
---------
061 STATEMENTS

MEDIA
---------
X01180
X01181

正如您所看到的,一个对象有多个媒体。我想要的是一个手动查询,我可以在其中使用对象名称对其进行修改,并使用其所有相应的媒体搜索一个对象,反之亦然。

这是我提出的查询:

  Select
  [Object],  
  CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA]
  WHERE [OBJECT] = '061 STATEMENTS'
  from JnlDataSection

但是我收到了这个错误:

Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'from'.

请注意:我正在使用SQL Server Management Studio 2008。

更新

阅读评论后,我尝试了这个查询:

Select
  [Object],  
  CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6) END AS [MEDIA]
 from JnlDataSection
 WHERE [MEDIA] = 'X05219'

它给了我这个错误:

Msg 207, Level 16, State 1, Line 5
Invalid column name 'MEDIA'.

我该如何解决?

1 个答案:

答案 0 :(得分:1)

要展开@JNK's suggestion,如果您想与计算出的MEDIA列进行比较,可以选择以下选项:

  1. 重现CASE子句中的WHERE表达式:

    SELECT
      [Object],  
      CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA]
    FROM JnlDataSection
    WHERE CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END = 'X05219'
    ;
    
  2. 将查询重新定义为common table expression

    WITH JnlDataSectionMedia AS (
      SELECT
        [Object],  
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA]
      FROM JnlDataSection
    )
    SELECT *
    FROM JnlDataSectionMedia
    WHERE [MEDIA] = 'X05219'
    ;
    

    或(正常)子选择:

    SELECT *
    FROM (
      SELECT
        [Object],  
        CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA]
      FROM JnlDataSection
    ) AS s
    WHERE [MEDIA] = 'X05219'
    ;
    
  3. 使用CROSS APPLY

    SELECT
      j.[Object],
      x.[MEDIA]
    FROM JnlDataSection AS j
    CROSS APPLY (
      SELECT CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END
    ) AS x ([MEDIA])
    WHERE x.[MEDIA] = 'X05219'
    ;
    
  4. 您还可以将查询定义为view

    CREATE VIEW JnlDataSectionMedia
    AS
    SELECT
      [Object],  
      CASE WHEN MsgID = '61' THEN SUBSTRING(Parms, 35, 6) END AS [MEDIA]
    FROM JnlDataSection
    ;
    

    之后,您可以随时拨打电话:

    SELECT [Object], [MEDIA]
    FROM JnlDataSectionMedia
    ;
    

    您也可以在必要时过滤任一列:

    SELECT [Object], [MEDIA]
    FROM JnlDataSectionMedia
    WHERE [MEDIA] = 'X05219'
    ;