টি-এসকিউএল-এ গল্ফ করার টিপস


16

টি-এসকিউএল গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা কমপক্ষে টি এসকিউএল-র সাথে কিছুটা নির্দিষ্ট। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।

আসল ধারণাটির জন্য মার্কোগকে ধন্যবাদ। :)


একটি টিপ - গল্ফ করার জন্য আলাদা ভাষা ব্যবহার করুন। এসকিএল এর উত্তরগুলি সাধারণত খুব কম পাওয়া যায় না বা মোটেও আপগ্রেট হয় না।
t-clausen.dk 16

উত্তর:


16

আমার কৌশলগুলির সাধারণ ব্যাগ ::

  • @ টি-স্কুএলে একটি বৈধ পরিবর্তনশীল।
  • T-sQLl 2012 iifএকটি ভিবি স্টাইলের কেস স্টেটমেন্ট যুক্ত করেছে। এটি প্রায় সর্বদা একটি সমতুল্য থেকে কম if else
  • \অর্থের ধরণের ক্ষেত্রে 0 হিসাবে সংখ্যার সূচনা করার একটি দরকারী উপায়। যোগ করে আপনি একটি মানকে একটি ফ্লোটে রূপান্তর করতে পারেন e। উদাহরণস্বরূপ 4eবা \kযা 0.00 মানকে k সেট করবে।
  • rCTE100 টি এন্ট্রির চেয়ে কম সংখ্যার টেবিল তৈরি করার সেরা উপায় বলে মনে হয়। স্পট_ভ্যালু ব্যবহারের চেয়েও ছোট। আপনার যদি 100 এর বেশি প্রয়োজন হয় তবে ক্রস করুন এবং এগুলি যুক্ত করুন।
  • += এবং অন্যান্য যৌগিক অপারেটরগুলি ২০০৮ সালে যুক্ত হয়েছিল them এগুলি ব্যবহার করুন এটি কয়েকটি অক্ষর সংরক্ষণ করে।
  • লিটারালগুলি অ্যালিজিংয়ের উদ্দেশ্যে সাধারণত যথেষ্ট পরিমাণে ডিলিমিটার হয়। আপনার খুব কমই জায়গা বা ক প্রয়োজন ;
  • আপনার প্রয়োজন হলে এএনএসআই এসকিউএল যোগ দেয় Use Select*from A,B where conditionএর চেয়ে কমselect*from A join b on condition
  • আপনার যদি নিশ্চিত হওয়া যায় যে আপনার সময় লুপটি প্রথম পুনরাবৃত্তিটি করবে তবে এটি ডু-ওয়েল স্টাইল gotoলুপ হিসাবে পুনরায় লেখা ভাল ।
  • STR()কোনও স্ট্রিকে রূপান্তর করতে সংক্ষিপ্ত ফাংশন। আপনি যদি একাধিক রূপান্তর করছেন বা বিভিন্ন সংখ্যক ডেটাটাইপগুলি concatফাংশনটি বিবেচনা করতে পারেন । উদাহরণস্বরূপ 'hello'+str(@)তুলনায় ছোট concat('hello',@), তবে এর hello+str(@)+str(@a)চেয়ে দীর্ঘ হয়concat('hello',@,@a)

উদাহরণস্বরূপ এই দুটি শব্দার্থগতভাবে সমতুল্য।

while @<100begin/*code*/set @+=1 end
s:/*code*/set @+=1if @<100goto s

আপনি Valuesএকটি টেবিল বা subquery তৈরি করতে ব্যবহার করতে পারেন । আপনার যদি কয়েকটি ধ্রুব সারি প্রয়োজন হয় তবে এটি কেবল সত্যই উপকারী হবে।


আমার জন্য, অর্থের ধরণের ক্ষেত্রে 0 হিসাবে একটি সংখ্যার সূচনা করার জন্য $ এর চেয়ে কিছুটা বেশি স্পষ্ট। YMMV
user1443098

5

এসকিউএল ব্যবহার করে কোড সংক্ষেপণ

এসকিউএল শব্দযুক্ত, স্কোরগুলি উচ্চতর এবং আমরা যতটা পছন্দ করি, SELECT FROM WHEREপ্রতিটি ব্যবহারের জন্য 23 বাইট খরচ হয়। আপনি এই এবং অন্যান্য পুনরাবৃত্তি শব্দ বা পুরো কোড স্নিপেট সংক্ষিপ্ত করতে পারেন। এটি করা পুনরাবৃত্ত কোডের প্রান্তিক ব্যয়কে 1 বাইটে হ্রাস করবে! *

এটি কীভাবে কাজ করে:

  • একটি ভেরিয়েবল ঘোষিত হয় এবং সংক্ষেপিত এসকিউএল কোড বরাদ্দ করা হয়
  • একটি টেবিল পরিবর্তনশীল পরিবর্তন করে। প্রতিটি সারি ভেরিয়েবলকে ডিফল্ট করে।
  • পরিবর্তিত পরিবর্তনশীল কার্যকর করা হয়।

সমস্যাটি:

আপফ্রন্ট ব্যয়টি 100 বাইটের কাছাকাছি এবং প্রতিস্থাপন টেবিলের প্রতিটি সারিতে আরও 6 বাইট খরচ হয়। আপনি প্রচুর কোডের সাথে কাজ করছেন যা আপনি ছাঁটাতে পারবেন না বা চ্যালেঞ্জটি সংক্ষেপণ-ভিত্তিক না হলে এই ধরণের যুক্তি খুব কার্যকর হবে না।

এখানে একটি উদাহরণ

চ্যালেঞ্জটি হ'ল 2,3 এর শেষ 10 গুণক এবং 5 টি এন পর্যন্ত অগ্রণী হওয়া। আসুন আমরা বলি যে এটি ( 343 বাইটস গল্ফড ) হ'ল আমি যে সর্বোত্তম সমাধানটি নিয়ে আসতে পারি:

WITH x AS(
    SELECT 99 n
UNION ALL 
    SELECT n-1
    FROM x
    WHERE n>1
)
SELECT w.n,t.n,f.n
FROM
    (SELECT n, ROW_NUMBER()OVER(ORDER BY n DESC)r
     FROM x WHERE n%2=0
    )w
,
    (SELECT n, ROW_NUMBER()OVER(ORDER BY n DESC)r
     FROM x WHERE n%3=0
    )t
,   (SELECT n, ROW_NUMBER()OVER(ORDER BY n DESC)r
     FROM x WHERE n%5=0
    )f
WHERE w.r=t.r AND w.r=f.r AND w.r<11
ORDER BY 1

কোড সংকুচিত করার পরে উদাহরণ

এটি উপরের মত একই কোডটি কার্যকর করে, ~ 302 বাইট গল্ফ হয়

DECLARE @a CHAR(999)='
WITH x AS(!99n UNION ALL !n-1 @x#n>1)
!w.n,t.n,f.n@$2=0)w,$3=0)t,$5=0)f
#w.r=t.r AND w.r=f.r AND w.r<11^1'

SELECT @a=REPLACE(@a,LEFT(i,1),SUBSTRING(i,2,99))
FROM(VALUES
  ('$(!n,ROW_NUMBER()OVER(^n DESC)r@x#n%'),
  ('! SELECT '),
  ('@ FROM '),
  ('# WHERE '),
  ('^ ORDER BY ')
)x(i)

EXEC(@a)

দুর্দান্ত কৌশল, সেই মাল্টি-রিপ্লেস স্টাইলটি আরও প্রচলিত পরিস্থিতিতেও কার্যকর হতে পারে।
ব্র্যাডিসি

1
কিছু পরীক্ষার পরে, আমি নির্ধারণ করেছি যে আপনার প্রতিস্থাপনের তালিকায় যদি 7 বা তারও কম আইটেম থাকে তবে আপনি এবং এর SELECT @=REPLACE(@,i,j)FROM(VALUES(...)x(i,j)সাথে একটি একক কলাম ব্যবহার না করে বাইটগুলি সংরক্ষণ করতে পারবেন । আপনার যদি 8 বা তার বেশি থাকে তবে অতিরিক্ত উদ্ধৃতি এবং কমাগুলি এড়ানো একটি ভাল ট্রেড অফ। LEFT()SUBSTRING()
ব্র্যাডিসি

প্রকৃতপক্ষে 4 বা তার চেয়ে কম প্রতিস্থাপনের জন্য, আপনি একটি পুরানো SET @=REPLACE(REPLACE(REPLACE(...
ধাঁচের

4

এখানে একটি মজার। এটি কলামের মানগুলিকে একক টুপলে রূপান্তর করবে।

সম্পাদনা: মন্তব্যের জন্য আপনাকে ধন্যবাদ। দেখে মনে হচ্ছে এক্সএমএল ট্যাগ ছাড়াই রোলিংয়ের সবচেয়ে সংক্ষিপ্ততম উপায়:

SELECT (SELECT column1+''
FROM table
ORDER BY column1
FOR XML PATH(''))

দ্রষ্টব্য: এক্সএমএল যদি একটি বৈধ আউটপুট হয় তবে আপনি বহিরাগত নির্বাচন এবং প্যারেনগুলি বাদ দিতে পারেন। এছাড়াও column1+'', কেবল স্ট্রিংয়ের জন্য কাজ করে। সংখ্যার ধরণের জন্য এটি করা ভালcolumn1+0


1
আসলে ফিরে আসবে <column_name>value1</column_name><column_name>value2</column_name>...। কোনও কলাম থেকে একটি সিএসভি পেতে আপনি DECLARE @ VARCHAR(MAX)='';SELECT @+=column_name+',' FROM table_name;SELECT @(@ মাইকেলাবলির প্রথম টিপটির জন্য ধন্যবাদ) যা ফিরে আসবে value1,value2,...। তবে এটি আপনার এক্সএমএল ট্রিকের চেয়ে 9 টি অক্ষরের বেশি :(
জ্যাকব

1
নোট আপনি এই খাটো করতে পারেন। Ltrimনির্বাচন হিসাবে প্রয়োজনীয় নয় (এক্সএমএল পাথের জন্য নির্বাচন করুন ... ('')) একটি প্রদান করে nvarchar(max)। এছাড়াও, কলামের জিনিসটি সমাধান করতে কেবল একটি অ-পরিবর্তনকারী এক্সপ্রেশন ব্যবহার করুন। সংখ্যার জন্য আপনি করতে পারেন v+0, স্ট্রিংয়ের জন্য খালি স্ট্রিং ইত্যাদি যুক্ত করুন যদিও আমি সত্যিই এটি একটি গল্ফিং টিপ হিসাবে বিবেচনা করি না, এটি দুঃখের সাথে কীভাবে এসকিএল সার্ভারে কোয়েরি লিখতে হয় তার বাস্তবতা।
মাইকেল বি 5

3

টি-এসকিউএল-তে কিছু বিটওয়াইজ অপারেটর ব্যবহার করা সম্ভব ।

আমার কাছে এর কোনও দৃ concrete় উদাহরণ নেই, তবে আমি বিশ্বাস করি যে টি-এসকিউএল এ গল্ফ করার সময় এটি একটি ভাল-জানা-সত্য।


1
এটি খুব বৈধ। পরিবর্তে একটি শর্ত লেখার পরিবর্তে x=0 or y=0, আপনি এটি যুক্তিসঙ্গত সমতুল্য হিসাবে লিখতে পারেন x|y=0যা বেশ কয়েকটি বাইট সংরক্ষণ করে!
মাইকেল বি


3

বৈজ্ঞানিক স্বরলিপি খুব বড় এবং খুব অল্প সংখ্যক, যেমন select 1000000000= select 1E9এবং select 0.000001= প্রকাশ করার জন্য একটি ছোট পদ্ধতি select 1E-6


2

মাইকেল বি একটি নম্বর টেবিলের জন্য পুনরাবৃত্ত সিটিই ব্যবহার করে উল্লেখ করেছেন , তবে উদাহরণ দেখান নি। এখানে এই এমএস-এসকিউএল সংস্করণটি রয়েছে যা আমরা এই অন্যান্য থ্রেডে কাজ করেছি :

--ungolfed
WITH t AS (
    SELECT 1 n 
    UNION ALL 
    SELECT n + 1
    FROM t 
    WHERE n < 99)
SELECT n FROM t

--golfed
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<99)SELECT n FROM t

নোট করুন আপনি আরম্ভের মান ( 1 n), অন্তর ( n + 1) এবং শেষ মান ( n < 99) পরিবর্তন করতে পারেন ।

আপনার যদি 100 টিরও বেশি সারি প্রয়োজন হয় তবে আপনাকে যুক্ত করতে হবে option (maxrecursion 0):

WITH t AS(SELECT 0n UNION ALL SELECT n+1FROM t WHERE n<9999)
SELECT n FROM t option(maxrecursion 0)

বা নিজেই আরসিটিইতে যোগ দিন:

WITH t AS(SELECT 0n UNION ALL SELECT n+1FROM t WHERE n<99)
SELECT 100*z.n+t.n FROM t,t z

যদিও এই শেষটি কোনওটি ছাড়াই সংখ্যায় ক্রমে ফিরে আসার গ্যারান্টিযুক্ত নয় ORDER BY 1


2

খুব দীর্ঘ স্ট্রিংয়ের জন্য GZIP সংক্ষেপণটি ব্যবহার করুন!

সুতরাং আমি জানলাম যে এসকিউএল 2016 একটি COMPRESSফাংশন (এবং একটি DECOMPRESSফাংশন) যুক্ত করেছে, যা (শেষ অবধি) স্ট্রিং বা বাইনারি জিজেপ করার ক্ষমতা নিয়ে আসে।

সমস্যাটি হ'ল গল্ফিংয়ের জন্য কীভাবে এর সুবিধা নেওয়া যায় তা অবিলম্বে পরিষ্কার নয়; COMPRESSএকটি স্ট্রিং নিতে পারে তবে একটিটি প্রদান করে VARBINARY, যা বাইটে সংক্ষিপ্ত হয় (যখন কোনও এসকিউএল VARBINARYক্ষেত্রে সঞ্চিত থাকে ) তবে অক্ষরগুলিতে দীর্ঘ হয় (কাঁচা হেক্স)।

আমি এটির সাথে আগেও খেলেছি, তবে অবশেষে এসও-র এই পুরানো উত্তরের ভিত্তিতে আমি একটি কার্যক্ষম সংস্করণ একসাথে রাখতে সক্ষম হয়েছি । পোস্টটি নতুন GZIP ফাংশন ব্যবহার করে না, তবে এটি VARBINARYএকটি বেস -৪৪ এনকোডড স্ট্রিংয়ে রূপান্তর করে । আমাদের কেবল নতুন ফাংশনগুলি সঠিক জায়গায় সন্নিবেশ করা দরকার এবং এটি কিছুটা গল্ফ করা উচিত।

আপনার দীর্ঘ দীর্ঘ স্ট্রিংটি বেস -৪৪ এনকোডেড সংক্ষেপিত স্ট্রিংয়ে রূপান্তর করতে আপনি এখানে কোডটি ব্যবহার করতে পারেন:

DECLARE @s VARCHAR(MAX)='Your really long string goes right here'
SELECT CONVERT(VARCHAR(MAX),(SELECT CONVERT(VARBINARY(MAX),COMPRESS(@s))
       FOR XML PATH(''),BINARY BASE64))

আউটপুটটি নিয়ে যান এবং এটি সহ আপনার মূল কোডটিতে মূল লং স্ট্রিংয়ের জায়গায় ব্যবহার করুন:

--To use your compressed string and return the original:
DECLARE @e VARCHAR(MAX)='H4sIAAAAAAAEAIvMLy1SKEpNzMmpVMjJz0tXKC4pygRS6fmpxQpFmekZJQoZqUWpAGGwW5YnAAAA'
SELECT CAST(DECOMPRESS(CAST(@e as XML).value('.','varbinary(max)'))AS varchar(max))

সুতরাং আপনার মূল কোডটির পরিবর্তে ( 1471 বাইট )

SELECT'Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. But, in a larger sense, we can not dedicate — we can not consecrate — we can not hallow — this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us — that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion — that we here highly resolve that these dead shall not have died in vain — that this nation, under God, shall have a new birth of freedom — and that government of the people, by the people, for the people, shall not perish from the earth.'

আপনার এটি হবে ( 1034 বাইট ):

SELECT CAST(DECOMPRESS(CAST('H4sIAAAAAAAEAGVUW47bMAy8Cg/g5hD9aLFA0a8C/aYt2hZWEVNJjpGT5LodinE2i/0JIouPmeFQP3QrVCctQpwDVblKpptwqcSLkt3O3FbBeSy6LWujWUtbSTO1NVaaNLeYJbeBmLLslLlFzYNdTBKvEihm+hVHKe029CZBQpy44aYpighdil60RsvDmRtxSnQGEAasqUiPlX8bpxP91p126TeSF168PtNiYTTFa0y0cxmoSQWwhfZVDL8XPsBpAZLb40hVX9B+QgganCkp6kgOW5ET/fXmZ2mmwdF45NaSfJujpEA6ezfg6PErX8FDz2KEj9pIvUBJ63/E92xoBO3xP3Oi8iBxSTyJKY9ArQJSSiAltFhp8IuFEuBXL/TClc7RhmaXJ3prhJFxarq4KHNsvb6RtikcOkHhuuoGLkH7nE/0fcOIu9SJy4LAKrnKYKGmUdb2Qe3++hXSVpnKl+8rpoxh3t1HC9yVw4n+wA9jMVYwwGC4D3xBGOIY89rKtiwJwzINhkPfow0cAagzY8aj4sZMfFG1n90IKnEIZoEgrfDUvOmuBXT3COulaMM0kCieEdgNUOQsZ9gYEB4K8e0BYNwgbHNm2KBik4LCHgmhbxSigz1mYKPcane/Uxyo9D0bDN8oL0vS5/zYlC3DF7Gu+Ay872gQp9U7mDCzb2jPWN0ZaGJKwOJZx3QD9SvD6uEA4l2feHrvnv9lS93ojeu7ScHAAVFGme3tQOr94eGiZwuHSVeFduKDM70avwscZAtd++er+sqrp068VTf5C63D4HBdRfWtvwxcsYq2Ns8a96dvnTxMD7JYH0093+dQxcFU897DhLgO0V+RK0gdlbopj+cCzoRGPxX+89Se5u/dGPtzOIO5SAD5e3drL7LAfiXDyM13HE+d6CWZY26fjr7ZH+cPgFhJzPspK+FpbuvpP9RXxXK3BQAA'as XML).value('.','varbinary(max)'))AS varchar(max))

এই উত্তরটি দেখুন যা আমাকে প্রায় 200 বাইট সংরক্ষণ করেছিল।

আমি গণিতটি করি নি, তবে পরিষ্কারভাবে ওভারহেডের কারণে এটি কেবলমাত্র দীর্ঘ দীর্ঘ স্ট্রিংয়ের জন্য কার্যকর হতে চলেছে। সম্ভবত অন্যান্য জায়গাগুলি এটি ব্যবহার করা যায় না; আমি ইতিমধ্যে আপনার কাছে SELECTএটি আবিষ্কার করেছি , আপনি এটি করতে পারবেন না PRINT, অন্যথায় আপনি পাবেন:

Xml data type methods are not allowed in expressions in this context.

সম্পাদনা : ডিকম্প্রেস কোডের সংক্ষিপ্ত সংস্করণ, @ ডিজস্কুপের সৌজন্যে :

CASTবাইটটিকে একটি অন্তর্নিহিত রূপান্তরটিতে ব্যবহার করে 10 টি বাইট সংরক্ষণ করুন CONCAT:

SELECT CONCAT('',DECOMPRESS(CAST('encoded_string_here'as XML).value('.','varbinary(max)')))

আপনি XMLপরিবর্তে প্রকারের একটি ভেরিয়েবল ঘোষণা করতে পারেন এবং VARCHAR(MAX)অভ্যন্তরীণে সংরক্ষণ করতে পারেন CAST:

DECLARE @ XML='encoded_string_here'
SELECT CONCAT('',DECOMPRESS(@.value('.','varbinary(max)')))

এটি নিজে থেকে কিছুটা দীর্ঘ, তবে অন্য কারণে যদি আপনার এটির পরিবর্তনশীল প্রয়োজন হয় তবে এটি সাহায্য করতে পারে।


সুন্দর, আমি এসকিউএল জানি না তবে এটি এখনও দুর্দান্ত দেখাচ্ছে
মিলকিওয়াই 90

1

চ্যালেঞ্জগুলির জন্য সারণী তৈরি ও ব্যবহার সম্পর্কে কয়েকটি ধারণা:

1. এসকিউএল ইনপুট একটি প্রাক বিদ্যমান টেবিল মাধ্যমে নেওয়া যেতে পারে

কোড গল্ফ ইনপুট / আউটপুট পদ্ধতি :

এসকিউএলস একটি নামযুক্ত টেবিল থেকে ইনপুট নিতে পারে

ইনপুট মান সহ এই টেবিলটি তৈরি করা এবং পপুলেটিং করা আপনার বাইট মোটের সাথে গণনা করা যায় না, আপনি কেবল ধরে নিতে পারেন এটি ইতিমধ্যে রয়েছে।

এর অর্থ আপনার গণনাগুলি ইনপুট টেবিল থেকে সাধারণ নির্বাচন বাছাইয়ের মাধ্যমে আউটপুট দিতে পারে:

SELECT 2*SQRT(a)FROM t

২. যদি সম্ভব হয় তবে আসলে কোনও টেবিল তৈরি করবেন না

(69 বাইট) এর পরিবর্তে:

CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t

শুধু (43 বাইট) করুন:

SELECT b FROM(VALUES(7),(14),(21),(99))t(b)

৩. যদি সম্ভব হয় তবে একটি নির্বাচন করে টেবিলটি তৈরি করুন

(39 বাইট) এর পরিবর্তে:

CREATE TABLE t(p INT)
INSERT t VALUES(2)

এটি করুন (17 বাইট):

SELECT 2 p INTO t

4: একসাথে একাধিক কলাম ম্যাসিং বিবেচনা করুন

এখানে দুটি ভিন্নতা যা একই আউটপুট ফেরত দেয়:

SELECT a,b FROM
(VALUES('W','Bob'),('X','Sam'),('Y','Darla'),('Z','Elizabeth'))t(a,b)

SELECT LEFT(a,1),SUBSTRING(a,2,99)FROM
(VALUES('WBob'),('XSam'),('YDarla'),('ZElizabeth'))t(a)

কিছু পরীক্ষার পরে, শীর্ষ সংস্করণ (একাধিক কলাম) 7 বা তার চেয়ে কম সারিগুলির সাথে সংক্ষিপ্ত বলে মনে হচ্ছে , নীচের সংস্করণটি (বাম এবং জমা দেওয়া কারণে) 8 বা ততোধিক সারিগুলির সাথে সংক্ষিপ্ত । আপনার সঠিক ডেটা নির্ভর করে আপনার মাইলেজ পরিবর্তিত হতে পারে।

5: পাঠ্যের খুব দীর্ঘ সিকোয়েন্সগুলির জন্য REPLACE এবং EXEC ব্যবহার করুন

আরামেড্রেইয়ের উত্তরের উত্তরের শিরাতে আপনার যদি 15 বা তার বেশি মান থাকে তবে উপাদানগুলির মধ্যে REPLACEপুনরাবৃত্ত '),('পৃথককারীদের থেকে মুক্তি পেতে একটি চিহ্ন ব্যবহার করুন :

১১৪ টি অক্ষর:

SELECT a FROM(VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H')
,('I'),('J'),('K'),('L'),('M'),('N'),('O'))t(a)

১১২ টি অক্ষর:

DECLARE @ CHAR(999)=REPLACE('SELECT a FROM(VALUES(''
 A-B-C-D-E-F-G-H-I-J-K-L-M-N-O''))t(a)','-','''),(''')EXEC(@)

আপনি যদি ইতিমধ্যে অন্যান্য কারণে (বা একাধিক প্রতিস্থাপন) জন্য ডায়নামিক এসকিউএল ব্যবহার করে থাকেন , তবে যে থ্রোসোল্ডটি এটির মূল্যবান তা অনেক কম।

6: ভেরিয়েবলগুলির একগুচ্ছের পরিবর্তে নামযুক্ত কলামগুলির সাথে একটি নির্বাচন করুন

এখানে জেএমল্টের দুর্দান্ত উত্তরে অনুপ্রাণিত হয়ে একটি নির্বাচন করে স্ট্রিংগুলি পুনরায় ব্যবহার করুন:

SELECT a+b+a+b+d+b+b+a+a+d+a+c+a+c+d+c+c+a+a
FROM(SELECT'Hare 'a,'Krishna 'b,'Rama 'c,'
'd)t

আয়

Hare Krishna Hare Krishna 
Krishna Krishna Hare Hare 
Hare Rama Hare Rama 
Rama Rama Hare Hare 

(জন্য মাইক্রোসফট এসকিউএল আমি পরিবর্তন \tএকটি ইন-লাইন রিটার্ন, এবং পরিবর্তিত CONCAT()করা +বাইট সংরক্ষণ করতে)।


1

টি-এসকিউএল সিনট্যাক্স হাইলাইট করার জন্য আপনার কোড ট্যাগ করুন

ন্যায়বিচারের পরিবর্তে:

CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t

এর মতো একটি ভাষা ট্যাগ অন্তর্ভুক্ত করুন:

<!-- language: lang-sql -->

    CREATE TABLE t(b INT)
    INSERT t VALUES(7),(14),(21),(99)
    SELECT b FROM t

এবং ফলাফলটি হবে:

CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t

1

এমএস এসকিউএল 2016 এবং এসকিউএল 2017 এ নতুন বৈশিষ্ট্য / ফাংশনগুলির সুবিধা নিন

যদি আপনার সাথে কাজ করার জন্য স্থানীয় কপি না থাকে তবে আপনি স্ট্যাকএক্সচেঞ্জ ডেটা এক্সপ্লোরার (এসকিউএল 2016) বা dbfiddle.uk (এসকিউএল 2016 বা এসকিউএল "ভিএনেক্সট") এর সাথে অনলাইনে খেলতে পারবেন ।

STRING_SPLIT ( এসকিউএল 2016 এবং পরবর্তী )

SELECT *
FROM STRING_SPLIT('one,two,three,four,five',',')

আপনার যদি টেবিলের নাম রাখতে হয় বা কলামের নামটি উল্লেখ করুন:

SELECT t.value
FROM STRING_SPLIT('one,two,three,four,five',',')t

ট্রিম ( এসকিউএল 2017 বা তার পরে )

চেয়ে RTRIM()কম এবং অবশ্যই চেয়ে কম LTRIM(RTRIM())

শুরু বা শেষের দিক থেকে অন্য অক্ষর বা অক্ষরের সেটগুলি অপসারণের একটি বিকল্প রয়েছে :

SELECT TRIM('sq,0' FROM 'SQL Server 2000')

আয় L Server 2

অনুবাদ ( এসকিউএল 2017 বা তার পরে )

TRANSLATEআপনাকে একসাথে নেস্টেড REPLACEস্টেটমেন্টের চেয়ে এক ধাপে একাধিক অক্ষর প্রতিস্থাপন করতে দেয় । তবে খুব বেশি উদযাপন করবেন না , এটি পৃথক একক অক্ষরকে কেবল আলাদা একক অক্ষর দ্বারা প্রতিস্থাপন করে।

SELECT TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()');

দ্বিতীয় স্ট্রিংয়ের প্রতিটি অক্ষর তৃতীয় স্ট্রিংয়ের সংশ্লিষ্ট অক্ষর দ্বারা প্রতিস্থাপিত হয় ।

দেখে মনে হচ্ছে আমরা এরকম কিছু দিয়ে অক্ষরের গুচ্ছটি নির্মূল করতে পারি REPLACE(TRANSLATE('source string','ABCD','XXXX'),'X','')


আরও কিছু আকর্ষণীয় বিষয়গুলিও পছন্দ করুন CONCAT_WSএবং STRING_AGGএটি সম্ভবত নজর দেওয়ার মতো।


1

পবিত্র গরু, আমি PARSENAME( এসকিউএল 2012 বা তারও বেশি ) এর আশ্চর্যতা আবিষ্কার করেছি ।

ফাংশন মত একটি বস্তু নামের অংশগুলি বিছিন্ন নির্মিত হয়েছিল servername.dbname.dbo.tablename, কিন্তু এটা কাজ করে কোন বিন্দু-বিভাজিত মানগুলির । কেবল মনে রাখবেন এটি বাম থেকে নয়, ডান থেকে গণনা করা হয়েছে :

SELECT PARSENAME('a.b.c.d',1),      -- d
       PARSENAME('a.b.c.d',2),      -- c
       PARSENAME('a.b.c.d',3),      -- b
       PARSENAME('a.b.c.d',4)       -- a

যদি আপনার 4 টিরও কম বিন্দু-বিভাজিত মান থাকে NULLতবে এটি বাকী (তবে এটির জন্য) ফিরে আসবে এখনও ডান থেকে বামে গণ্য হয় ):

SELECT PARSENAME('a.b',1),      -- b
       PARSENAME('a.b',2),      -- a
       PARSENAME('a.b',3),      -- NULL
       PARSENAME('a.b',4)       -- NULL

যদিও যাদুটি এখানে আসে: যদিও মেমরির বহু-কলামের টেবিলগুলিSTRING_SPLIT তৈরি করতে এটি (2016 বা উচ্চতর) এর সাথে সংযুক্ত করুন !

পুরাতন এবং পর্দা:

SELECT a,b,c FROM
(VALUES('Bob','W','Smith'),
       ('Sam','X','Johnson'),
       ('Darla','Y','Anderson'),
       ('Elizabeth','Z','Turner'))t(a,b,c)

নতুন উত্তাপ:

SELECT PARSENAME(value,3)a,PARSENAME(value,2)b,PARSENAME(value,1)c
FROM string_split('Bob.W.Smith-Sam.X.Johnson-Darla.Y.Anderson-Elizabeth.Z.Turner','-')

স্পষ্টতই আপনার আসল সঞ্চয় টেবিলের আকার এবং বিষয়বস্তু এবং আপনি কীভাবে এটি ব্যবহার করছেন তার উপর নির্ভর করে।

মনে রাখবেন যদি আপনার ক্ষেত্র ধ্রুবক-চওড়া হয়, আপনি ব্যবহার বন্ধ সম্ভবত ভালো আছেন LEFTএবং RIGHTতাদের পরিবর্তে আলাদা PARSENAME(না শুধুমাত্র কারণ ফাংশন নাম খাটো, কিন্তু কারণ আপনার বিভাজক সম্পূর্ণরূপে বাদ দিতে পারে)।


আমি নিশ্চিত নই যে পারসাম কখন প্রকাশিত হয়েছিল, তবে 2003 থেকে এটি বর্ণনা করার জন্য নিবন্ধগুলি রয়েছে
t-clausen.dk

1

আমি দেখেছি এবং সংরক্ষণ করতে চেয়েছিল আরও দুটি সম্পর্কহীন কৌশল:

  1. GO #একটি নির্দিষ্ট বারের জন্য একটি ব্লকের পুনরাবৃত্তি করতে ব্যবহার করুন

পলের দুর্দান্ত উত্তরের এই চতুর কৌশলটি দেখেছি ।

PRINT'**********'
GO 10

এটি অবশ্যই ব্লকের কোনও কাউন্টার ভেরিয়েবল পুনরায় সেট করবে, যাতে আপনাকে এটি কোনও WHILEলুপ বা লুপের বিপরীতে বিবেচনা করতে হবে x: ... GOTO x

  1. SELECT TOP ... FROM systypes

পলের উপরের মত একই প্রশ্ন থেকে অনুজ ত্রিপাঠি নিম্নলিখিত কৌশলগুলি ব্যবহার করেছেন :

SELECT TOP 10 REPLICATE('*',10) FROM systypes

বা, মন্তব্যে গোলাপীফ্লোয়েডএক্স 33 এর পরামর্শ অনুসারে:

SELECT TOP 10'**********'FROM systypes

উল্লেখ্য এই প্রকৃত কোনো নির্ভর করে না বিষয়বস্তু এর systypesজন্য, শুধুমাত্র সেই সিস্টেম দৃশ্য বিদ্যমান (যা প্রতি মাইক্রোসফট SQL ডাটাবেস মধ্যে আছে), এবং রয়েছে অন্তত 10 সারি (এটা 34 ধারণ দেখায় এসকিউএল সাম্প্রতিকতম সংস্করণের জন্য )। আমি সংক্ষিপ্ত নামগুলির সাথে কোনও সিস্টেমের দর্শন পাইনি (যার জন্য sys.উপসর্গের প্রয়োজন নেই ), তাই এটি আদর্শ হতে পারে।


1

দেখুন dba.stackexchange উপর এই প্রশ্নের একটি STRING_SPLIT ফলাফলের একটি সংখ্যাকে কলাম যোগ করার জন্য কিছু মজার ধারনা।

একটি স্ট্রিং দেওয়া হয়েছে 'one,two,three,four,five', আমরা এর মতো কিছু পেতে চাই:

value   n
------ ---
one     1
two     2
three   3
four    4
five    5
  1. প্রতি জো ওবিশের উত্তর, ব্যবহার করুন ROW_NUMBER()এবং NULLক্রমাগত বা ধ্রুবক দ্বারা আদেশ করুন :

    SELECT value, ROW_NUMBER() OVER(ORDER BY (SELECT 1))n
    FROM STRING_SPLIT('one,two,three,four,five',',')
    
  2. প্রতি পল হোয়াইট এর উত্তর, একটি ব্যবহার করুনSEQUENCE :

    CREATE SEQUENCE s START WITH 1
    SELECT value, NEXT VALUE FOR s 
    FROM STRING_SPLIT('one,two,three,four,five', ',')
    

সিকোয়েন্সগুলি আকর্ষণীয় অবিচ্ছিন্ন অবজেক্টস; আপনি ডেটা টাইপ, ন্যূনতম এবং সর্বাধিক মান, ব্যবধান এবং এটি শুরুতে মোড়ানো কিনা তা নির্ধারণ করতে পারেন:

    CREATE SEQUENCE s TINYINT;     --Starts at 0
    CREATE SEQUENCE s MINVALUE 1;  --Shorter than START WITH
    SELECT NEXT VALUE FOR s        --Retrieves the next value from the sequence
    ALTER SEQUENCE s RESTART;      --Restarts a sequence to its original start value
  1. প্রতি বিজু Jose এর উত্তর, আপনি ব্যবহার করতে পারেন ফাংশন (যা না হিসাবে একই সম্পত্তি একটি সন্নিবেশ সাথে:IDENTITY() IDENTITY

    SELECT value v,IDENTITY(INT) AS n
    INTO t
    FROM STRING_SPLIT('one,two,three,four,five',',')
    
    SELECT * FROM t
    

মনে রাখবেন যে শেষের দুটি প্যারামিটারগুলি al IDENTITY(INT,1,1)চ্ছিক, এবং বাদ না এলে ডিফল্ট হবে।


সমস্যাটি হল যে STRING_SPLIT কোনও রিটার্ন অর্ডারের গ্যারান্টি দেয় না। আপনি হয়ত ভাবেন যে এটি সর্বদা আসল স্ট্রিংয়ে টোকেনগুলির ক্রমে রোসেটটি ফিরিয়ে দেবে। আসলে এটি এমনকি এটি করতে পারে! তবে ডক্সে কোনও গ্যারান্টি নেই। আপনি যদি অর্ডার সম্পর্কে চিন্তা না করেন তবে তা ঠিক। তবে আপনি যদি (উদাহরণস্বরূপ CSV ফর্ম্যাটে একটি সারি পার্সিং) করেন তবে একটি সমস্যা আছে।
ব্যবহারকারী 1443098

1
@ user1443098 আমি ব্যবসার উদ্দেশ্যে কোডের প্রস্তাব দেওয়ার প্রসঙ্গে শেষ পর্যন্ত আপনার সাথে একমত হই, যেমন আমরা ডিবিএএসইতে দেখতে পারি like তবে পিপিসিজি নিয়ে চ্যালেঞ্জের জন্য আমার মান কিছুটা আলাদা; যদি আমার কোডটি আমি চাইলে ক্রমগুলি সারি দেয় তবে আমি যে বাইটগুলি পারি সেগুলি সংরক্ষণ করব। আমি কীভাবে এটি ছেড়ে চলে যেতে পারি তার অনুরূপ ORDER BY( উদাহরণস্বরূপ টোস্টি, বার্ন্ট, ব্রুলির প্রতি আমার উত্তর দেখুন )।
ব্র্যাডিসি

1

সবেমাত্র আবিষ্কার হয়েছে যে আপনি উদ্ধৃতিগুলি মুছে ফেলার জন্য একক অক্ষরের জন্য অঙ্কগুলি ব্যবহারREPLACE করতে পারেন :

--44 bytes
PRINT REPLACE('Baby Shark******','*',' doo')

--42 bytes
PRINT REPLACE('Baby Shark000000',0,' doo')

এটি কারণ REPLACEস্ট্রিংয়ে একটি অন্তর্নিহিত রূপান্তর করে।

উভয়ই একই আউটপুট উত্পাদন করে:

Baby Shark doo doo doo doo doo doo

0

_ এবং # টি বৈধ উপাধি। আমি এগুলি ক্রস প্রয়োগের সাথে এটিকে এটি ব্যবহার করে কলামগুলি প্রদর্শিত হয় যাতে এটি ফেরত দেওয়া দণ্ডের অংশ হয় use

SELECT TOP 10 number, n2
FROM master.dbo.spt_values v
CROSS APPLY (SELECT number*2 n2) _

আমি এটি পছন্দ করি যখন ক্রস প্রয়োগের একমাত্র উদ্দেশ্য হল একটি অভিব্যক্তি গণনা করা।

এই বিষয়টির জন্য, সাব-এক্সপ্রেশনগুলির কম্পিউটিংয়ের জন্য APPLY ব্যবহার করা আপনার কোডটি DRY-er (এবং আরও ছোট) করার একটি ঝরঝরে উপায়। মৃত্যুদন্ড কার্যকর করার পরিকল্পনাগুলিতে আমি যা দেখেছি তার থেকে এই পদ্ধতির কোনও অতিরিক্ত মূল্য নেই। সংকলকটি পরিসংখ্যান করেছেন যে আপনি কেবল কোনও কিছু গণনা করছেন এবং এটিকে অন্য কোনও এক্সপ্রেশনের মতো আচরণ করেন।


আমি ক্রসের প্রয়োগ দীর্ঘায়িত করেছি, অন্য একটি ছোট পদ্ধতি না পেয়ে ক্রস প্রয়োগ ব্যবহার করে দরকারী পরিস্থিতি খুঁজে পাওয়া সত্যিই কঠিন
t-clausen.dk

ঠিক আছে - উপরের উদাহরণটি সংক্ষিপ্ত করুন!
ব্যবহারকারী 1443098

শীর্ষস্থানীয় 10 নম্বর নির্বাচন করুন, সংখ্যা 2 2 এন 2 থেকে 2
মাস্টার.ডিব.এসপি_মূল্যগুলি

আমি বলতে চাইছি, যোগ দিন রাখা। যাইহোক, আপনি একবার এক্সএমএল কোয়েরিগুলি তৈরি করার পরে, ক্রস অ্যাপ্লিকেশনটি এটি করার একমাত্র উপায় হয়ে উঠতে পারে, কারণ কোনও সাবকোরিতে কোনও কলামই এতে যোগদান করতে পারে না।
ব্যবহারকারী 1443098

সাবসलेक्टগুলি আবেদনের চেয়ে সংক্ষিপ্ত: শীর্ষ থেকে ১০ টি নির্বাচন করুন (নির্বাচন করুন নম্বর এন, সংখ্যা * 2n2 মাস্টার থেকে..এসপি_মূল্য) x
t-clausen.dk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.