I'm supposed to convert a certain integer value to an asterisk for the exact value of that integer.
Example: Given value = 10, I have to have 10 asterisk **********.
Is it possible by using the REPLACE function?
This should help you..
SELECT RPAD('*',10,'*') from dual;
Related
I'm working with a schema (not created by me) that has calculated variances that can be really long numbers. I need to identify these long numbers so I can trunc them. The problem is that they are so long, the length function doesn't seem to recognize them as being long.
SELECT Length(10.00000000000000000000000000000000000004) FROM dual;
result: 2
Obviously the number above is longer than 2 digits, but the length function doesn't recognize this. How do I get an accurate length of this number, so I can find all the cases where they exist?
This happens because the length() function accepts a string as input, not a number, so the value is implicitly converted to a string using some default format before the function ever sees it.
There may be a more elegant mathematical solution, but one approach would be to use the 'text minimum' number format, length(to_char(num,'TM')):
with demo(num) as (select 10.00000000000000000000000000000000000004 from dual)
select to_char(num)
, to_char(num,'TM')
, length(to_char(num,'TM'))
from demo;
TO_CHAR(NUM) TO_CHAR(NUM,'TM') LENGTH(TO_CHAR(NUM,'TM'))
------------- ----------------------------------------- -------------------------
10 10.00000000000000000000000000000000000004 41
I did not expect this to be a problem, but I'm struggling to return the first 3 numbers, including the 0's before them. In the below examples, I show a few things I've tried. I want it to return '001'. It either returns '118' or an error. It seems like every solution wants to convert them to a text, which will drop the 0's.
SELECT lpad(00118458582::text, 3, '0')
returns 118
SELECT lpad(00118458582, 3, '0')
ERROR: function lpad(integer, integer, unknown) does not exist
SELECT left(00118458582::text, 3)
returns 118
SELECT left(00118458582, 3)
ERROR: function left(integer, integer) does not exist
SELECT substring(00118458582::text, 1, 3)
returns 118
Can I get any help please? Thanks!
Your problem starts before you try to get the first 3 digits, namely that you're considering 00118458582 to be a valid INTEGER (or whatever numeric type). I mean, it's not invalid, but what happens when you run SELECT 00118458582::INTEGER? You get 118458582. Because leading zeros in those types are senseless. So you'll never have a situation as in your examples (outside of a hardcoded number with leading zeros in your query window) in your tables, because those zeros wouldn't be stored in your number-based data type fields.
So the only way to get that sort of situation is when they're string-based: SELECT '00118458582'::TEXT returns 00118458582. And at that point you can run your preferred function to get the first 3 characters, e.g. SELECT LEFT('00118458582', 3) which returns 001. But if you're planning on casting that to INTEGER or something, forget about leading zeros.
SELECT substring(00118458582::text, 1, 3)
returns 118 because it is a number 118458582 (the leading zeros are automatically dropped), that is converted to text '118458582' and it then takes the first 3 characters.
If you are trying to take the first three digits and then convert to a number you can use try:
select substring('00118458582', 1,3::numeric)
it might actually be:
select substring('00118458582', 1,3)::numeric
I don't have a way to test right now...
lpad() refers to the total length of the returned value. So I think you want:
select lpad(00118458582::text, 12, '0'::text)
If you always want exactly 3 zeros before, then just concatenate them:
select '000' || 00118458582::text
Do you know how to format the output of a number in hive with thousand separator? For example:
data:146452664
output:146,452,664
I use this in Teradata, but don't know how to achieve in Hive.
cast(cast(cast(number as integer) as format'ZZZ,ZZZ,ZZZ,ZZ9') as char(11))
Use the format_number() function.
select format_number(146452664,0)
The first argument is the number and second is the number of decimal places to round.If D is 0, the result has no decimal point.
I am trying to use a simple Translate function to replace "-" in a 23 digit string. The example of one such string is "1049477-1623095-2412303" The expected outcome of my query should be 104947716230952412303
The list of all "1049477-1623095-2412303" is present in a single column "table1". The name of the column is "data"
My query is
Select TRANSLATE(t.data, '-', '')
from table1 as t
However, it is returning 104947716230952000000 as the output.
At first, I thought it is an overflow error since the resulting integer is 20 digit so I also tried to use following
SELECT CAST(TRANSLATE(t.data,'-','') AS VARCHAR)
from table1 as t
but this is not working as well.
Please suggest a way so that I could have my desirable output
This is too long for a comment.
This code:
select translate('1049477-1623095-2412303', '-', '')
is going to return:
'104947716230952412303'
The return value is a string, not a number.
There is no way that it can return '104947716230952000000'. I could only imagine that happening if somehow the value is being converted to a numeric or bigint type.
Try regexp_replace()
Taking your own example, execute:
select regexp_replace('[string / column_name]','-');
It can be achieve RPAD try below code.
SELECT RPAD(TRANSLATE(CAST(t.data as VARCHAR),'-','') ,20,'00000000000000000000')
I have some value with data type Numeric(28,10) (e.g. 128000,0000000000). I want to round it up to 2 significances and convert it into string. What is wrong with this?
convert(varchar,round(isnull(td2.Qty,0),2))
where td2.Qty is that value. It coverts it to string, but doesn't round it. Thanks in advance
It does round, but it keeps displaying the zeros because this is how numerics are always displayed.
If you need to stop displaying zeros, convert the value to a different type after the rounding, e.g. float or numeric(28,2):
convert(varchar, cast(round(isnull(td2.Qty,0),2) as numeric(28,2)))
SELECT CAST(round(isnull(128000,0000000000),2)AS FLOAT)
SELECT CAST(round(isnull(128000,0000000000),2)AS NUMERIC(28,2))
Let me explain the use of ROUND() function in SQL. It will not return the decimal value for the given length. E.g. round(isnull(td2.Qty,0),2) will not return friction value length 2, but rather
(e.g. 128000.0000000000) to (e.g. 128000.00)
instead of
(e.g. 128000.12340000000) to (e.g. 128000.120000000000).
It returns only after decimal 2 value and remain all '0'. In your case you want ROUND to truncate. so you can use
Cast(round(isnull(td2.Qty,0),2)as decimal(18,2));