2010-06-17 26 views
3

我动态选择使用另一个字符串构建的字符串。因此,如果字符串2 =“大卫旗帜”,然后MyDynamicString应该是“DBanne”在Where子句中引用时,选择动态字符串具有不同的值

Select 
... 
, Left(
    left((select top 1 strval from dbo.SPLIT(string1,' ')) //first word 
    ,1) //first character 
    + (select top 1 strval from dbo.SPLIT(string1,' ') 
     //second word 
     where strval not in (select top 1 strval from dbo.SPLIT(string1,' '))) 
,6) //1st character of 1st word, followed by up to 5 characters of second word 
[MyDynamicString] 
,... 
From table1 Join table2 on table1pkey=table2fkey 
Where MyDynamicString <> table2.someotherfield 

我知道table2.someotherfield 不等于的动态字符串。然而,当我用Where的子句中的MyDynamicString替换为完全左侧(左侧(等..函数,它按预期的方式工作)。

我可以在查询中稍后引用此字符串吗?是否必须使用左(左(等等。如果你这样做,你有它上面的函数在where子句?

回答

3

各一次,那么答案是肯定的,你必须在where子句中。

再重新创建作为替代,您可以使用内联视图:

Select 
    ... 
    , X.theString 
    ,... 
    From table1 Join table2 on table1pkey=table2fkey 
     , (SELECT 
      string1 
     ,Left(
      left((select top 1 strval from dbo.SPLIT(string1,' ')) //first word 
       ,1) //first character 
      + (select top 1 strval from dbo.SPLIT(string1,' ') 
      //second word 
      where strval not in (select top 1 strval from dbo.SPLIT(string1,' '))) 
      ,6) theString //1st character of 1st word, followed by up to 5 characters of second word 
     FROM table1 
     ) X 
    Where X.theString <> table2.someotherfield 
     AND X.string1 = <whatever you need to join it to> 
+1

+1光滑,现在测试 – 2010-06-17 14:46:39

+0

这是未经测试的,所以你可能不得不稍微调整语法,但我认为这个想法应该可行。另请参阅我的最新编辑。确保在内联视图中添加列别名(即“theString”部分)。 – dcp 2010-06-17 14:48:10

+0

如何在此内联视图中引用table1.string1?内联视图的FROM子句对我​​来说还不清楚。我可以使用'FROM table1 JOIN table2 ON table1pkey = table2fkey',但是我必须重复Where子句吗?在我的实际代码中,Where子句有另外5或6个条件 – 2010-06-17 15:06:30

1

在SQL 2中008,您可以在ORDER BY CLAUSE中使用别名,但不能在where子句中使用。

为什么不将计算包装到用户定义的函数(UDF)中以避免违反DRY并且使查询更具可读性?

如果很重要,这里是一个article,它解释了为什么您不能在HAVING,WHERE或GROUP BY中使用列别名。

+0

@JohnFx - 如果这是他使用这种计算的唯一查询,我认为UDF是矫枉过正的,最好将查询分解为内联视图。就我个人而言,我宁愿在查询中看到它,所以我不必追踪UDF来弄清楚发生了什么。但是如果它的代码将被许多查询使用,我同意你100%UDF是要走的路。 – dcp 2010-06-17 15:00:01

+0

我喜欢这个 - 我想我必须在dcp的答案中的内联视图的FROM子句中重复自己。 – 2010-06-17 15:00:04

+0

@大卫 - 你不应该重复计算,它应该只在内联视图。或者,也许我误解了? – dcp 2010-06-17 15:01:30

相关问题