【问题标题】:SELECT Name WHERE LevenshteinFunction ReturnValue > 80 AND also select the ReturnValue选择名称 WHERE LevenshteinFunction ReturnValue > 80 并选择 ReturnValue
【发布时间】:2014-03-04 22:08:09
【问题描述】:

我有以下 SQL-Select 语句:

SELECT [Name], 
       [No_] 
  FROM [Table] 
 WHERE dbo.fn_Levenshtein('Mobel Meller', [Name]) > 80
  • 然后我得到:姓名,否
  • 我想要什么:姓名、否、ReturnValue

我的解决方案如下,但由于性能原因,我不想为每条记录调用 两次 次函数......还有其他方法吗?

SELECT [Name], 
       [No_], 
       dbo.fn_Levenshtein('Mobel Meller', [Name]) 
  FROM [Table] 
 WHERE dbo.fn_Levenshtein('Mobel Meller', [Name]) > 80

编辑:我不放心,如果它真的运行了两次。也不是如何检查。

Edit2:我的第二条语句的执行计划: 但是我看不懂这个 ExecutionPlan.. 那么它会运行两次吗?

【问题讨论】:

  • 你确定它实际上每行运行两次算法吗?
  • this 有什么帮助吗?
  • @Phylogenesis 不,我不确定,但我也不知道如何检查它是否运行两次..
  • 尝试运行它并查看执行计划。另外,看看这个stackoverflow.com/questions/1260281/… 如果它被调用两次,你可能需要使用 CTE
  • @RichAndrews 我确实为你上传了这个执行计划 =)

标签: sql sql-server tsql select


【解决方案1】:

为了扩展我的评论,以下是您查询的 CTE 版本...

WITH Result ([Name], [No_], [Distance]) AS (
SELECT [Name], 
       [No_], 
       dbo.fn_Levenshtein('Mobel Meller', [Name]) 
  FROM [Table] 
)

SELECT * 
FROM Result
WHERE [Distance] > 80

改编自答案here。我特别喜欢这一点,即使仅在 CTE 版本感觉更易于维护时才运行。

【讨论】:

    【解决方案2】:

    试试这个

    SELECT tb.Name, 
           tb.[No_], 
           Result 
      FROM [Table] tb
           CROSS APPLY dbo.fn_Levenshtein('Mobel Meller', tb.[Name]) AS Result
     WHERE Result > 80;
    

    【讨论】:

    • 也许这也可行,但我已经找到了可行的方法。无论如何,谢谢!
    【解决方案3】:
    SELECT * FROM
    (
    SELECT [Name], 
           [No_], 
           dbo.fn_Levenshtein('Mobel Meller', [Name]) as [rtnval]
      FROM [Table]
    ) as RTNTBL 
     WHERE [rtnval] > 80
    

    【讨论】:

    • 它与已经发布的解决方案有何不同/更好?
    • 上一篇关于“拥有”声明的帖子发布时,我正在打字,抱歉,我是菜鸟
    • @Alexander 因为它可能不需要额外的列?
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多