我有一个查询只提取两列,并将其中一列修剪为仅媒体名称。这是对此的查询:
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'.
我该如何解决?
答案 0 :(得分:1)
要展开@JNK's suggestion,如果您想与计算出的MEDIA
列进行比较,可以选择以下选项:
重现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'
;
将查询重新定义为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'
;
使用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'
;
您还可以将查询定义为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'
;