当使用 "SELECT varname = something + something etc. I cannot then do "WHERE varname = ..."

when using "SELECT varname = something + something etc. I cannot then do "WHERE varname = ..."

我有:

 SELECT KEYWORDS = CAST(USRN AS VARCHAR(15)) + ' ' + 
 RTRIM(SD) + ' ' + RTRIM(NL.LOCALITY_NAME) + ' ' + 
 RTRIM(NT.TOWN_NAME) + ' ' + RTRIM(NA.AUTHORITY_NAME)

这让我看起来像一个专栏,但不是:

我想要它,所以我的代码只从关键字中选择与用户输入的内容匹配的行。通常,如果 KEYWORDS 是一列,我会写:

SELECT .... WHERE KEYWORDS = '%whateverTheUserIsTyping%'

但我不能,因为关键字不是一个真正的列,它告诉我它不存在。

我该如何解决这个问题?谢谢

您可以使用带别名的派生 table(此处为 Q),并通过在 WHERE 子句中进行过滤来获取结果:

SELECT Q.KEYWORDS FROM (
 SELECT KEYWORDS = CAST(USRN AS VARCHAR(15)) + ' ' + 
   RTRIM(STREET_DESCRIPTOR) + ' ' + RTRIM(NSG_LOCALITY.LOCALITY_NAME) + ' ' + 
   RTRIM(NSG_TOWN.TOWN_NAME) + ' ' + RTRIM(NSG_AUTHORITY.AUTHORITY_NAME)
 ) AS Q
WHERE Q.KEYWORDS LIKE '%whateverTheUserIsTyping%'

因为您不能像您提到的那样在 WHERE 子句中使用列别名。您也可以使用 LIKE 运算符代替 KEYWORDS = '%whateverTheUserIsTyping%'

列别名 KEYWORDS 在计算 WHERE 子句时对 SQL 引擎不可见。不过,您可以重复您的 CAST 语句。

SELECT 
  KEYWORDS = CAST(USRN AS VARCHAR(15)) + ' ' +  
  RTRIM(STREET_DESCRIPTOR) + ' ' + RTRIM(NSG_LOCALITY.LOCALITY_NAME) + ' ' + 
  RTRIM(NSG_TOWN.TOWN_NAME) + ' ' + RTRIM(NSG_AUTHORITY.AUTHORITY_NAME)
FROM yourTable
WHERE 
  CAST(USRN AS VARCHAR(15)) + ' ' +  
  RTRIM(STREET_DESCRIPTOR) + ' ' + RTRIM(NSG_LOCALITY.LOCALITY_NAME) + ' ' + 
  RTRIM(NSG_TOWN.TOWN_NAME) + ' ' + RTRIM(NSG_AUTHORITY.AUTHORITY_NAME)
  LIKE '%whateverTheUserIsTyping%'