Searching '$' character in SQL query - sql

How can I search for "$" special character in SQL query?
I'm trying to get hosts ended by $ character. This is Apache Impala.
I tried this:
SELECT DISTINCT(host) FROM dclogwindows WHERE host LIKE '%[\$]'
But I get:
Done. 0 results.
Tried too:
SELECT DISTINCT(host) FROM dclogwindows WHERE host LIKE '%$'
But same results
In a global search I see many hosts like this:
SELECT host FROM dclogwindows
H3932924934$
M4234278281$
M4545656543$ ...
No matter what I do, if I use a dollar symbol, results are 0.
Tried '%$%', tried ilike, tried '%$'
Explorer version: Hue™ 3.11 - IU de Hadoop

You don't need to escape anything. The following should work:
WHERE host LIKE '%$'
'$' is not a special character in LIKE patterns. In most databases, only '%' and '_' are. Sometimes, '\', '[', ']', and '*' are depending on the database.
EDIT:
Your problem is probably in the interface level. I'm not sure how to escape the value there. Perhaps:
WHERE host LIKE '%\$'

Solved: Brave Browser was the problem, using Firefox the query works right.
I uninstalled Brave and reinstalled without any extensions and it works too.
I think it was "MetaMask" extension, but I am not able to repeat the error with a new installation of MetaMask
Thank U everybody

Related

TRIM or REPLACE in Netsuite Saved Search

I've looked at lots of examples for TRIM and REPLACE on the internet and for some reason I keep getting errors when I try.
I need to strip suffixes from my Netsuite item record names in a saved item search. There are three possible suffixes: -T, -D, -S. So I need to turn 24335-D into 24335, and 24335-S into 24335, and 24335-T into 24335.
Here's what I've tried and the errors I get:
Can you help me please? Note: I can't assume a specific character length of the starting string.
Use case: We already have a field on item records called Nickname with the suffixes stripped. But I've ran into cases where Nickname is incorrect compared to Name. Ex: Name is 24335-D but Nickname is 24331-D. I'm trying to build a saved search alert that tells me any time the Nickname does not equal suffix-stripped Name.
PS: is there anywhere I can pay for quick a la carte Netsuite saved search questions like this? I feel bad relying on free technical internet advice but I greatly appreciate any help you can give me!
You are including too much SQL - a formulae is like a single result field expression not a full statement so no FROM or AS. There is another place to set the result column/field name. One option here is Regex_replace().
REGEXP_REPLACE({name},'\-[TDS]$', '')
Regex meaning:
\- : a literal -
[TDS] : one of T D or S
$ : end of line/string
To compare fields a Formulae (Numeric) using a CASE statement can be useful as it makes it easy to compare the result to a number in a filter. A simple equal to 1 for example.
CASE WHEN {custitem_nickname} <> REGEXP_REPLACE({name},'\-[TDS]$', '') then 1 else 0 end
You are getting an error because TRIM can trim only one character : see oracle doc
https://docs.oracle.com/javadb/10.8.3.0/ref/rreftrimfunc.html (last example).
So try using something like this
TRIM(TRAILING '-' FROM TRIM(TRAILING 'D' FROM {entityid}))
And always keep in mind that saved searches are running as Oracle SQL queries so Oracle SQL documentation can help you understand how to use the available functions.

SQL Server Like is not working with Square brackets and hyphens

I am trying to do a like for following charecters,
[C0-S12]ECT-PM18052
As metnioned in this post I tried following query,
WHERE Barcode LIKE '[[C0-S12]%'
and this returns everything. It completely ignores the left side which is constant. For example I am getting back following results back.
[C0-S12]ECT-PM18052
[C0-S8]ECT-PM18052
[C0-B14]ECT-PM18052
[C0-S17]ECT-PM18052
[C0-B3]ECT-PM18052
[C0-S7]ECT-PM18052
[C0-B12]ECT-PM18052
I have also tried following this post and escaped using '/ /'.
WHERE Barcode LIKE '\[C0-S12%\'
and this does not return anything atll.
This version works:
WHERE Barcode LIKE '$[C0-S12]%' ESCAPE '$'
I notice that the \ escape doesn't work on Rextester. It should work, but it doesn't.

Indexing service

I have a problem to get data by Indexing Service.
ServerName: RETSO-NT21.CA.com
CatalogName: MyCatalog1
TextSearch: test
Here is my Query:
SELECT path, filename
FROM RETSO-NT21.CA.com.MyCatalog1..scope()
WHERE FREETEXT(Contents,'%test%')
When I run it I'll get this error message:
Incorrect syntax near '-'. Expected end-of-file, ';', AS, CREATE,
DOT, DOTDOT, DOTDOT_SCOPE, DOTDOTDOT, DOTDOTDOT_SCOPE, DROP, ORDER_BY,
SELECT, SET, WHERE. SQLSTATE=42000
It's working fine when I use a server name without "-" & "."
But obviously I can not change server name.
Anybody can help how can I use server name with special characters in query??
Thanks
Ok I found the solution.
Just needs to put the server name in " ".
like this:
SELECT path, filename
FROM "RETSO-NT21.CA.com".MyCatalog1..scope()
WHERE FREETEXT(Contents,'%test%')

regex - how to match all select queries in a file in notepad++

I'm trying to pull out all select queries in a file. Actually I need to know how many select queries there are in a script. For that I use notepad++.
I look for strings in the following configurations:
'SELECT * FROM'
'SELECT aWORD FROM'
'SELECT FIRSTWORD, SECONDWORD, THIRDWORD FROM'
I have tried with the following regex:
select (\w+)(,\s*\w+)* from
This one didn't work in notepad++. What am I doing wrong?
Thanks in advances.
Manel
Based on your regex, it should be this:
select[\*]*[\w+]*[,\s*\w+]*from
Update: Tried this on Notepad++ 5.8.2 and it works.
As the above regex is a greedy expression and 5.8.2 does not support non-greedy regex, you may have to upgrade to v5.9.3 which does.
Tried using the below regex and it does show you non-greedy results:
select.+?from
use this:
['"]\s*select[*,\s\w]+from\s*['"]
it also matches invalid querys (i think that is not a matter) but respects the desired quotes (and double quotes also)
perhaps you want to add = inside the search
Notepad++ was build on top of scintilla and uses POSIX regex, take a look at Regular Expressions in SciTE
Based on your example, your probably looking for :
select[a-z\*, ]+from
I've tested this on Notepad++ 5.9 and it matches the examples you've provided.

Replace character in SQL results

This is from a Oracle SQL query. It has these weird skinny rectangle shapes in the database in places where apostrophes should be. (I wish we would could paste screen shots in here)
It looks like this when I copy and paste the results.
spouse�s
is there a way to write a SQL SELECT statement that searches for this character in the field and replaces it with an apostrophe in the results?
Edit: I need to change only the results in a SELECT statement for reporting purposes, I can't change the Database.
I ran this
select dump('�') from dual;
which returned
Typ=96 Len=3: 239,191,189
This seems to work so far
select translate('What is your spouse�s first name?', '�', '''') from dual;
but this doesn't work
select translate(Fieldname, '�', '''') from TableName
Select FN from TN
What is your spouse�s first name?
SELECT DUMP(FN, 1016) from TN
Typ=1 Len=33 CharacterSet=US7ASCII: 57,68,61,74,20,69,73,20,79,6f,75,72,20,73,70,6f,75,73,65,92,73,20,66,69,72,73,74,20,6e,61,6d,65,3f
EDIT:
So I have established that is the backquote character. I can't get the DB updated so I'm trying this code
SELECT REGEX_REPLACE(FN,"\0092","\0027") FROM TN
and I"m getting ORA-00904:"Regex_Replace":invalid identifier
This seems a problem with your charset configuracion. Check your NLS_LANG and others NLS_xxx enviroment/regedit values. You have to check the oracle server, your client and the client of the inserter of that data.
Try to DUMP the value. you can do it with a select as simple as:
SELECT DUMP(the_column)
FROM xxx
WHERE xxx
UPDATE: I think that before try to replace, look for the root of the problem. If this happens because a charset trouble you can get big problems with bad data.
UPDATE 2: Answering the comments. The problem may be is not on the database server side, may be is in the client side. The problem (if this is the problem) can be a translation on server to/from client comunication. It's for a server-client bad configuracion-coordination. For instance if the server has defined UTF8 charset and your client uses US7ASCII, then all acutes will appear as ?.
Another approach can be that if the server has defined UTF8 charset and your client also UTF8 but the application is not able to show UTF8 chars, then the problem is in the application side.
UPDATE 3: On your examples:
select translate('What. It works because the � is exactly the same char: You have pasted on both sides.
select translate(Fieldname. It does not work because the � is not stored on database, it's the char that the client receives may be because some translation occurs from the data table until it's showed to you.
Next step: Look in DUMP syntax and try to extract the codes for the mysterious char (from the table not pasting �!).
I would say there's a good chance the character is a single-tick "smart quote" (I hate the name). The smart quotes are characters 91-94 (using a Windows encoding), or Unicode U+2018, U+2019, U+201C, and U+201D.
I'm going to propose a front-end application-based, client-side approach to the problem:
I suspect that this problem has more to do with a mismatch between the font you are trying to display the word spouse�s with, and the character �. That icon appears when you are trying to display a character in a Unicode font that doesn't have the glyph for the character's code.
The Oracle database will dutifully return whatever characters were INSERTed into its' column. It's more up to you, and your application, to interpret what it will look like given the font you are trying to display your data with in your application, so I suggest investigating as to what this mysterious � character is that is replacing your apostrophes. Start by using FerranB's recommended DUMP().
Try running the following query to get the character code:
SELECT DUMP(<column with weird character>, 1016)
FROM <your table>
WHERE <column with weird character> like '%spouse%';
If that doesn't grab your actual text from the database, you'll need to modify the WHERE clause to actually grab the offending column.
Once you've found the code for the character, you could just replace the character by using the regex_replace() built-in function by determining the raw hex code of the character and then supplying the ASCII / C0 Controls and Basic Latin character 0x0027 ('), using code similar to this:
UPDATE <table>
set <column with offending character>
= REGEX_REPLACE(<column with offending character>,
"<character code of �>",
"'")
WHERE regex_like(<column with offending character>,"<character code of �>");
If you aren't familiar with Unicode and different ways of character encoding, I recommend reading Joel's article The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!). I wasn't until I read that article.
EDIT: If your'e seeing 0x92, there's likely a charset mismatch here:
0x92 in CP-1252 (default Windows code page) is a backquote character, which looks kinda like an apostrophe. This code isn't a valid ASCII character, and it isn't valid in IS0-8859-1 either. So probably either the database is in CP-1252 encoding (don't find that likely), or a database connection which spoke CP-1252 inserted it, or somehow the apostrophe got converted to 0x92. The database is returning values that are valid in CP-1252 (or some other charset where 0x92 is valid), but your db client connection isn't expecting CP-1252. Hence, the wierd question mark.
And FerranB is likely right. I would talk with your DBA or some other admin about this to get the issue straightened out. If you can't, I would try either doing the update above (seems like you can't), or doing this:
INSERT (<normal table columns>,...,<column with offending character>) INTO <table>
SELECT <all normal columns>, REGEX_REPLACE(<column with offending character>,
"\0092",
"\0027") -- for ASCII/ISO-8859-1 apostrophe
FROM <table>
WHERE regex_like(<column with offending character>,"\0092");
DELETE FROM <table> WHERE regex_like(<column with offending character>,"\0092");
Before you do this you need to understand what actually happened. It looks to me that someone inserted non-ascii strings in the database. For example Unicode or UTF-8. Before you fix this, be very sure that this is actually a bug. The apostrophe comes in many forms, not just the "'".
TRANSLATE() is a useful function for replacing or eliminating known single character codes.