यह समझना भी महत्वपूर्ण है कि ANY
है नहीं एक ऑपरेटर लेकिन एक SQL निर्माण जिसका उपयोग केवल दाएं . के लिए किया जा सकता है एक ऑपरेटर का। अधिक:
- रेल के साथ WHERE क्लॉज में IN के बजाय Any का उपयोग कैसे करें?
LIKE
ऑपरेटर - या अधिक सटीक:अभिव्यक्ति , जिसे ~~
. के साथ फिर से लिखा जाता है ऑपरेटर पोस्टग्रेज में आंतरिक रूप से - मान . की अपेक्षा करता है बाईं ओर और पैटर्न दांई ओर। कोई COMMUTATOR
नहीं है इस ऑपरेटर के लिए (जैसे साधारण समानता ऑपरेटर के लिए है =
) इसलिए पोस्टग्रेज ऑपरेंड को इधर-उधर नहीं कर सकते।
आपका प्रयास:
select * from someTable where '%someInput%' LIKE ANY(someColum);
बाएँ और दाएँ ऑपरेंड फ़्लिप किया गया है इसलिए '%someInput%'
मान है और सरणी कॉलम के तत्व someColum
पैटर्न के रूप में लिया जाता है (जो वह नहीं है जो आप चाहते हैं)।
यह करेगा ANY(someColum) LIKE '%someInput%'
- सिवाय इसके कि ANY
. के साथ संभव नहीं है निर्माण जिसकी अनुमति केवल दाएं . को है एक ऑपरेटर का। आप यहां रोड ब्लॉक कर रहे हैं।
संबंधित:
- क्या रेगेक्स पैटर्न वाले टेक्स्ट कॉलम को उपयोगी रूप से अनुक्रमित करने का कोई तरीका है?
- क्या PostgreSQL सरणी स्तंभों को अनुक्रमित कर सकता है?
आप अपने रिलेशनल डिज़ाइन को सामान्य कर सकते हैं और तत्वों . को सहेज सकते हैं एक अलग तालिका में अलग-अलग पंक्तियों में सरणी का। इसे छोड़कर, unnest()
समाधान है, जैसा कि आप पहले ही खुद को पा चुके हैं। लेकिन जब आप केवल कम से कम एक मेल खाने वाले तत्व के अस्तित्व में रुचि रखते हैं, एक EXISTS
परिणाम में डुप्लिकेट से बचने के दौरान सबक्वेरी सबसे कुशल होगी - पहला मैच मिलते ही पोस्टग्रेज खोज को रोक सकता है:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
आप someInput
. में विशेष वर्ण से बचना चाह सकते हैं . देखें:
- रेगुलर एक्सप्रेशन या LIKE पैटर्न के लिए एस्केप फ़ंक्शन
निषेध से सावधान (NOT LIKE ALL (...)
) जब NULL
शामिल हो सकते हैं:
- जांचें कि पोस्टग्रेज ऐरे में NULL मौजूद है या नहीं