我是SQL的新手,它似乎与传统编码不同。无论如何,我试图弄清楚为什么我的结果最终为空,但只能使用第一个AND语句。如果删除此语句,则代码有效。语法似乎正确。我想做的是将通道名称与列末尾的“ P”和“ HDP”匹配,而不匹配通道号。也许我在语法上是错误的。在这个问题上的任何帮助,将不胜感激。另外,我正在使用Microsoft SQL Server Management Studio2012。
结果应如何显示:
SELECT a.ChannelNumber AS "Standard Channel",
a.DisplayName AS "Standard Name",
b.ChannelNumber AS "HD Channel",
b.DisplayName AS "HD Name"
FROM CHANNEL a CROSS JOIN CHANNEL b
WHERE b.ChannelNumber <> a.ChannelNumber
AND b.DisplayName = a.DisplayName /*this is what is giving me problems*/
AND RIGHT(b.DisplayName, 3) LIKE '%HDP'
AND RIGHT(a.DisplayName, 1) LIKE '%P';
答案 0 :(得分:1)
最终,您希望AETVP
和AETVHDP
之类的东西“相等”。这似乎不是Cross Join
的用例。您可以使用CTE进行分解。
首先,您将定义高清频道,然后是标准频道。在每个这些块中,您都可以获取频道名称的核心部分(没有P
或HDP
的部分)。然后将它们一起加入CoreName上。这将使我们能够将AETV
加入AETV
WITH HdChannels
AS (
SELECT *
,CoreName = left(DisplayName, len(DisplayName) - len('HDP'))
FROM Channel
WHERE displayName LIKE '%HDP'
)
,StdChannels
AS (
SELECT *
,CoreName = left(DisplayName, len(DisplayName) - len('P'))
FROM Channel
WHERE displayName LIKE '%P'
AND displayName NOT LIKE '%HDP'
)
SELECT std.ChannelNumber AS [Standard Channel]
,std.DisplayName AS [Standard Name]
,hd.ChannelNumber AS [HD Channel]
,hd.DisplayName AS [HD Name]
FROM HdChannels hd
INNER JOIN StdChannels std ON std.CoreName = hd.CoreName
答案 1 :(得分:0)
要回答您的问题,
“给出为什么我的AND子句在SQL中返回空字符串的原因”
标准表和高清表之间唯一的区别是高清表以“ HDP”结尾。标准表以“ HD”结尾,尽管它们的确以“ P”结尾。
在没有样本数据的情况下,我提供了我可以想到的使用临时表的最基本示例。
DECLARE @CHANNEL TABLE(ChannelNumber int, DisplayName varchar(100))
INSERT INTO @CHANNEL VALUES
(3, 'ABCP'), (25, 'ABCHDP')
SELECT a.ChannelNumber AS "Standard Channel",
a.DisplayName AS "Standard Name",
b.ChannelNumber AS "HD Channel",
b.DisplayName AS "HD Name"
FROM @CHANNEL a CROSS JOIN @CHANNEL b
WHERE LEFT(a.DisplayName, LEN(a.DisplayName) - 1) + 'HDP' = b.DisplayName
AND a.DisplayName NOT LIKE '%HDP'
AND b.DisplayName LIKE '%HDP'
AND a.ChannelNumber <> b.ChannelNumber
产生输出:
Standard Channel Standard Name HD Channel HD Name
3 ABCP 25 ABCHDP
该算法在CROSS JOIN的左侧和右侧标识标准通道(NOT LIKE '%HDP'
)和HD通道(LIKE '%HDP'
)。
请注意,您在代码中输入了AND RIGHT(b.DisplayName, 3) LIKE '%HDP'
...,当您使用RIGHT
指示字符串的结尾时,不必指定长度为chars的LIKE '%HDP'
函数
LEFT(a.DisplayName, LEN(a.DisplayName) - 1) + 'HDP'
切断标准频道的DisplayName的最后一个字符(按其命名约定,该字符始终为'P'),并在结果末尾连接“ HDP”。将其与始终以“ HDP”结尾的高清频道的格式进行比较。
当条件匹配时,您将获得一行数据。
查看过滤条件-您可以看到a.DisplayName 永远不能等于 b.DisplayName