【问题标题】:Deleting certain words depending on length of the value根据值的长度删除某些单词
【发布时间】:2014-10-21 16:22:42
【问题描述】:

我在一个查询中有一个连接,它从不同的字段中获取值并创建产品名称。我的问题是我需要将名称保持在 80 个字符以下,所以如果它在那里传递 80 个字符 是我应该能够删除的“名称”中的某些关键词。例如

Oracle Lights 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights 

没关系,不到 80 个字符。

但是对于:

Oracle Lights 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights

这是88个字符,所以我必须想办法,如果这个连接太长,可以删除Lights这个词。如果仍然超过 80 个字符,则应该删除世界 Oracle

对于任何想了解[year_single] = 79-80, [make] = American Motors, [model] = AMX, and [color] = Amber 领域的人。其他所有内容都是添加到连接中的字符串,因为它是静态的。

有谁知道我可以做到这一点的方法吗?

【问题讨论】:

  • 由于决定截断哪些值以及需要截断多个值可能会变得复杂,我建议使用 VBA 函数,在其中传递原始字符串并让它返回所需的结果。如果您需要该功能的帮助,请提供规则以及要截断的关键字。另外,您可以使用缩写词吗?例如,HL 表示前灯等?
  • 很遗憾我不能使用缩写。我将使用规则和关键字编辑原始帖子
  • 从示例字符串中仅删除“Lights”将留下 2 个连续的空格。这是一个问题吗?
  • 它会,我猜我们最终将上传到的平台会将额外的空格计为字符

标签: sql ms-access vba ms-access-2013


【解决方案1】:

您可以尝试在 vba 中进行以下操作。

if len(yourfield) > 80 then Replace(yourfield, "Lights ", "") end if
if len(yourfield) > 80 then Replace(yourfield, "Oracle ", "") end if

【讨论】:

  • 我会在其中添加空格,这样您就没有多余的字符。喜欢: Replace(yourfield, "Lights_", "") 但用空格键替换下划线。我不得不添加下划线,因为很难看出那里有空格。
  • @JohnnyBones 好点。它还可以避免原始代码的问题,因为Replace(... ,"Lights","") 将返回'Oracle 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Head',因为Replace() 不区分大小写。
  • 有趣!我什至没有意识到前灯中的“灯”也可能被取出。我会实现它,看看我能得到什么。
  • 我不完全确定如何将它实现到 vba 中,我得到“编译错误,预期语句结束”
【解决方案2】:

对于那里的 SQL“纯粹主义者”,这里有一种无需 VBA 的方法。给定一个名为 [tblData] 的实际数据表

ID  year_single  make             model    color     
--  -----------  ---------------  -------  ----------
 1  79-80        American Motors  AMX      Amber     
 2  79-83        American Motors  Concord  ColorSHIFT

以及包含填充文本可能变化的表格:

[tblFiller1]

Filler1      
-------------

Oracle       
Oracle Lights

[tblFiller2]

Filler2 
--------
4x6"    
4x6" LED

和 [tblFiller3]

Filler3                 
------------------------
Halo 2 Sealed Headlights

我们可以创建一个名为 [qryDescriptOptions] 的已保存 Access 查询

SELECT
    ID,
    Len(Descrip) AS DescripLen,
    Descrip
FROM
    (
        SELECT 
            ID,
            Filler1 & IIf(Len(Nz(Filler1,""))>0," ","") & 
                year_single & " " & make & " " & model & 
                IIf(Len(Nz(Filler2,""))>0," ","") & Filler2 & 
                " " & color & 
                IIf(Len(Nz(Filler3,""))>0," ","") & Filler3
                AS Descrip
        FROM
            tblData, tblFiller1, tblFiller2, tblFiller3
    )

它在表上使用交叉连接来为我们提供所有排列:

ID  DescripLen  Descrip                                                                                 
--  ----------  ----------------------------------------------------------------------------------------
 1          61  79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights                           
 2          70  79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights                  
 1          65  79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights                       
 2          74  79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights              
 1          68  Oracle 79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights                    
 2          77  Oracle 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights           
 1          72  Oracle 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights                
 2          81  Oracle 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights       
 1          75  Oracle Lights 79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights             
 2          84  Oracle Lights 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights    
 1          79  Oracle Lights 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights         
 2          88  Oracle Lights 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights

所以查询

SELECT
    ID,
    MAX(DescripLen) AS MaxOfDescripLen
FROM qryDescripOptions
WHERE Descriplen<=80
GROUP BY ID

为我们提供仍然适合 80 个字符的每个 ID 的最长描述长度

ID  MaxOfDescripLen
--  ---------------
 1               79
 2               77

现在我们可以将它加入到我们保存的查询中以检索实际描述

SELECT
    q.ID,
    q.Descrip
FROM
    qryDescripOptions q
    INNER JOIN
    (
        SELECT
            ID,
            MAX(DescripLen) AS MaxOfDescripLen
        FROM qryDescripOptions
        WHERE Descriplen<=80
        GROUP BY ID
    ) maxlen
        ON q.ID = maxlen.ID AND q.DescripLen = maxlen.MaxOfDescripLen

生产

ID  Descrip                                                                        
--  -------------------------------------------------------------------------------
 1  Oracle Lights 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights
 2  Oracle 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights  

在这种特殊情况下,给定 ID 的 MaxOfDescriptLen 值上的“tie”不会导致重复,但为了防止这种可能性,我们会将整个事情包装在一个聚合查询中

SELECT 
    ID, 
    MIN(Descrip) AS Description
FROM
    (
        SELECT
            q.ID,
            q.Descrip
        FROM
            qryDescripOptions q
            INNER JOIN
            (
                SELECT
                    ID,
                    MAX(DescripLen) AS MaxOfDescripLen
                FROM qryDescripOptions
                WHERE Descriplen<=80
                GROUP BY ID
            ) maxlen
                ON q.ID = maxlen.ID AND q.DescripLen = maxlen.MaxOfDescripLen
    )
GROUP BY ID

【讨论】:

  • 感谢您的意见。我明白了,因此您必须在运行实际查询之前为填充文本创建单独的表,我已经在查询中创建了名称,所以让我四处看看,看看我如何尝试将它放在那里。我也想了解您是如何做到这一点的,尤其是将其包装在聚合查询中。
【解决方案3】:

好的,感谢 Phicon 将我推向正确的方向。我创建了一个函数,它接受一个字符串并检查其长度,如果字符串超过 80 个字符,则取出“Lights”,如果字符串仍然超过 80 个字符,则取出“Oracle”,然后在更新查询中调用它。

Public Function shortname(value As String) As String
    Dim temp As String
    temp = value

    If Len(temp) > 80 Then temp = Replace(temp, "Lights ", "", 1, 1)
    If Len(temp) > 80 Then temp = Replace(temp, "Oracle ", "", 1, 1)

    shortname = temp
End Function

更新查询:

UPDATE tbldata SET name = shortname(name);

【讨论】:

    猜你喜欢
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多