Postgresql:匹配数组中包含的完整单词

时间:2016-11-30 05:49:33

标签: sql postgresql

我的查询为:

         try
         {
            AutoResetEvent _eventNotify = new AutoResetEvent(false);

            WaitHandle[] waitHandles = new WaitHandle[] 
            {_eventNotify,    eventTerminate };

            while (!eventTerminate.WaitOne(0, true))
            {
                result = RegNotifyChangeKeyValue(registryKey, false, regFilter, _eventNotify.SafeWaitHandle, true);

                if (WaitHandle.WaitAny(waitHandles) == 0)
                {
                    retVal = RegQueryValueEx(registryKey, registryValueName, 0, ref type, pResult, ref size);
                    if (retVal == 0)
                    {
                        string currentValue = Marshal.PtrToStringAnsi(pResult);
                        if(!cachedValue.Equals(currentValue,StringComparison.InvariantCultureIgnoreCase))
                        {
                            OnRegistryChanged();
                        }
                    }
                }
            }
        }
        finally
        {
            if (registryKey != IntPtr.Zero)
            {
                RegCloseKey(registryKey);
            }
        }

query_arr 是:

select id 
from events 
where description is not null 
  and (name ilike any (query_arr) 
       or description ilike any (query_arr) 
       or additional_info ilike any (query_arr) 
       or venue_name ilike any (query_arr) 
       or other_category ilike any (query_arr) 
       or eventful_category ilike any (query_arr) )

但是现在我需要匹配完整的单词而不是{'%Tomato%','%Potato%','%Pines%'} ilike符号,因为如果描述是'Porcupines是rodentian哺乳动物'那么 query_arr < / strong>单词' pines '匹配,这是不正确的。

因此,我需要在查询的表列中的任何位置匹配完整的单词。

3 个答案:

答案 0 :(得分:1)

FTS - 是一个庞大而复杂的主题。不要原样使用我的例子。

select id from events where to_tsquery('Tomato Potato Pines') @@ to_tsvector(events::text);

答案 1 :(得分:0)

您可以在PostgreSql中使用此语法

~*ANY('{query_arr}'::text[])

您的查询应该是这样的

select id from events where description is not null and (name ~*ANY('{query_arr}'::text[]) or description ~*ANY('{query_arr}'::text[]) or additional_info ~*ANY('{query_arr}'::text[]) or venue_name ~*ANY('{query_arr}'::text[]) or other_category ~*ANY('{query_arr}'::text[]) or eventful_category ~*ANY('{query_arr}'::text[])  

答案 2 :(得分:0)

在这种情况下更改

{'%Tomato%','%Potato%','%Pines%'}

{'% Tomato %','% Potato %','% Pines %'}

应该够了吗?..