Postgresql নির্বাচন করুন যদি স্ট্রিং থাকে


116

সুতরাং আমার পোস্টগ্র্যাস্কলটিতে একটি রয়েছে:

TAG_TABLE
==========================
id            tag_name       
--------------------------
1             aaa
2             bbb
3             ccc

আমার সমস্যাটি সহজ করার জন্য, আমি যা করতে চাই তা হল TAG_TABLE থেকে 'আইডি' নির্বাচন করুন যখন স্ট্রিং "আআআআআআআআআ" "ট্যাগ_নাম" থাকে। সুতরাং আদর্শভাবে, এটি কেবল "1" ফেরত উচিত, এটি ট্যাগ নাম 'আ' এর আইডি

আমি এখন পর্যন্ত এটিই করছি:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'

তবে স্পষ্টতই, এটি কার্যকর হয় না, যেহেতু পোস্টগ্রাগেসরা মনে করে যে '% ট্যাগ_নাম%' এর অর্থ সেই কলামের অধীনে প্রকৃত ডেটা মানের পরিবর্তে 'ট্যাগ_নাম' রয়েছে এমন একটি প্যাটার্ন।

আমি কীভাবে ট্যাগ_নামটি প্যাটার্নে পাস করব ??

উত্তর:


142

আপনার উদ্ধৃতিগুলির বাইরে 'ট্যাগ_নাম' ব্যবহার করা উচিত; তারপরে এটি রেকর্ডের ক্ষেত্র হিসাবে ব্যাখ্যা করা। '||' ব্যবহার করে সংবিধান আক্ষরিক শতাংশ লক্ষণ সহ:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';

5
ট্যাগ_নাম যখন হয় "; drop table TAG_TABLE; --"?
ডেনিস ডি বার্নার্ডি

24
@ ডেনিস: কিছুই হয় না। আপনি কোনও সারি পাবেন না, কারণ WHEREধারাটি মূল্যায়ন করে FALSE। বিবৃতিটি গতিশীল নয়, কেবল মানগুলি সংক্ষেপিত হয়, এসকিউএল ইঞ্জেকশনের কোনও সুযোগ নেই।
এরউইন ব্র্যান্ডসটেটার

4
আআআ এবং ট্যাগ_নামের বিপরীত হওয়া উচিত না? আমি বোঝাতে চাইছি যে আপনার পরে একটি কলামের নাম রাখা উচিত
ব্যবহারকারীর 151496

@ user151496 না কারণ প্যাটার্নটি LIKEকীওয়ার্ডের ডানদিকে যেতে হবে ।
jpmc26

4
সাবধান হন যে LIKEযখন কোনও ভেরিয়েবলগুলি আন্ডারস্কোর (_) বা শতাংশ অক্ষর (%) থাকে তখন কোনও প্যাটার্নে ভেরিয়েবলগুলি ব্যবহার করার কারণে অনিচ্ছাকৃত পরিণতি হতে পারে। এই চরিত্রগুলি থেকে বাঁচার জন্য এটি প্রয়োজন হতে পারে, উদাহরণস্বরূপ এই ফাংশনটির সাথে: CREATE OR REPLACE FUNCTION quote_for_like(text) RETURNS text LANGUAGE SQL IMMUTABLE AS $$ SELECT regexp_replace($1, '([\%_])', '\\\1', 'g'); $$;(ব্যবহারকারী মেথিউসঅল থেকে # পোস্টগ্র্রেসকিএল আইআরসি চ্যানেল থেকে ফ্রিণোড)।
মার্টিন ভন উইট্টিচ

47

আমি ব্যক্তিগতভাবে ~ অপারেটরের সহজ বাক্য গঠন পছন্দ করি।

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

পার্থক্যটি বোঝার জন্য পোস্টগ্রিসে লাইক এবং between এর মধ্যে পার্থক্যের মধ্য দিয়ে পড়া মূল্যবান । `


4
এটি তখনই কার্যকর tag_nameহয় যখন কোনও উপযুক্ত REGEX থাকে। বেশ ঝুঁকিপূর্ণ।
জাকুব ফেডিজাক

@JakubFedyczak আক্ষরিক TAG_NAME আপনি ব্যবহার করতে পারেন মেলে ***=যা উল্লেখ করা হয় postgresql.org/docs/current/static/functions-matching.html । তবে আমি খুঁজে পেয়েছি যে strpos/ positionসমাধানগুলির তুলনায় খুব বেশি ধীর হতে হবে ।
ফুনেহে

32

একটি স্ট্রিংয়ের সন্ধানের একটি সঠিক উপায় হ'ল ভাবের positionপরিবর্তে ফাংশন ব্যবহার করা like, যার জন্য পলায়ন প্রয়োজন %, _এবং একটি পালানোর অক্ষর ( \ডিফল্টরূপে):

SELECT id FROM TAG_TABLE WHERE position(tag_name in 'aaaaaaaaaaa')>0;

এটি করার সঠিক উপায় এটি। কারওরই হ্যাকি রেজেক্স পন্থা ব্যবহার করা উচিত নয়।
খোল

LIKEএবং সূচকগুলি ILIKEব্যবহার করতে পারেন ginpositionনা পারেন.
ইউজিন পাখোমভ

16

সাথে সমাধানের পাশাপাশি 'aaaaaaaa' LIKE '%' || tag_name || '%'রয়েছে position(আরোগুলির বিপরীত ক্রম) এবং strpos

SELECT id FROM TAG_TABLE WHERE strpos('aaaaaaaa', tag_name) > 0

যা আরও দক্ষ (লাইকের তুলনায় কম দক্ষ দেখায় তবে একটি সূচক জিনিসগুলিকে পরিবর্তন করতে পারে) এ ছাড়াও, LIKE এর সাথে একটি অতি সামান্য সমস্যা রয়েছে: কোনও ভুল মিথ্যা ধনাত্মকতা না দেওয়ার জন্য ট্যাগ_নাম অবশ্যই থাকতে হবে %এবং বিশেষত _(একক চর ওয়াইল্ডকার্ড) থাকা উচিত নয় ।



-2
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || "tag_name" || '%';

tag_name উদ্ধৃতিতে থাকা উচিত অন্যথায় এটি ত্রুটি দেবে কারণ ট্যাগ_নামটি উপস্থিত নেই


4
এটি গৃহীত উত্তরের ঠিক বিপরীত । স্ট্রিং হিসাবে এটির একটি কলাম হওয়া দরকার হিসাবে আপনি
সুরজ রাও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.