给出为什么我的AND子句在SQL中返回空字符串的原因

时间:2018-10-10 17:15:57

标签: sql-server

我是SQL的新手,它似乎与传统编码不同。无论如何,我试图弄清楚为什么我的结果最终为空,但只能使用第一个AND语句。如果删除此语句,则代码有效。语法似乎正确。我想做的是将通道名称与列末尾的“ P”和“ HDP”匹配,而不匹配通道号。也许我在语法上是错误的。在这个问题上的任何帮助,将不胜感激。另外,我正在使用Microsoft SQL Server Management Studio2012。

结果应如何显示:

enter image description here

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';

2 个答案:

答案 0 :(得分:1)

最终,您希望AETVPAETVHDP之类的东西“相等”。这似乎不是Cross Join的用例。您可以使用CTE进行分解。

首先,您将定义高清频道,然后是标准频道。在每个这些块中,您都可以获取频道名称的核心部分(没有PHDP的部分)。然后将它们一起加入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中返回空字符串的原因”

  • 这是因为您在WHERE中声明了a.DisplayName = b.DisplayName。根据您链接到的输出图片,情况并非如此,因为显示名称的拼写有所不同。

标准表和高清表之间唯一的区别是高清表以“ 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